LINUX.ORG.RU

Perl, ад, сатана)

 , ,


0

1

Всем привет!

Только начинаю работу с perl'ом. Никак не могу врубит в выделение подстрок в строке. Требуется выбрать из строки:

[Tue Feb 10 20:22:57 2015] [info] id: 17, text: «Hello»

Сецию с датой (без квадратных скобок) и значение id.

Подскажите лучшее на Ваш взляд решение данной задачи.

Заранее, спасибо.


Ответ на: комментарий от Sektor
while (<STDIN>) {
   if ( ... ) {
   }
}

Вместо STDIN можешь подсунуть свой хендлер.

joy4eg ★★★★★
()

На JS можно было бы так


s="[Tue Feb 10 20:22:57 2015] [info] id: 17, text: «Hello»"

console.log(
 s.match( /\[([^\]]*\d{4})]/)[1], ">>>",
 s.match(/(id:[^,]*),/)[1]
)

// ::: Tue Feb 10 20:22:57 2015 >>> id: 17
[/js]

anonymous
()
print $1,$2 if /^\[(.+?)\].+id\:\s(.+),/;
Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
echo '[Tue Feb 10 20:22:57 2015] [info] id: 17, text: Hello' | perl -a -n -F'[][]' -e 'print $F[1], "\n"'

Tue Feb 10 20:22:57 2015

perldoc -f split

anonymous
()

Подскажите лучшее на Ваш взляд решение данной задачи.

#!/usr/bin/env python
UVV ★★★★★
()

Подскажите лучшее на Ваш взляд решение данной задачи.

Поменять клавиатуру. 146%

mos ★★☆☆☆
()

Только начинаю работу с perl'ом

заканчивай

umren ★★★★★
()
Ответ на: комментарий от Deleted
# perl -MBenchmark=timethese -e '$a = shift; timethese($ARGV[0], { ''A'' => sub { $a =~ m#\[(.+?)\] .*? id: (\d+),# && return [ $1, $2 ] }, ''B'' => sub { if ($a =~ m/^\[(.+\d{4})\].*id\:\s+(\d+)\,/) { return [ $1, $2 ] } }, ''C'' => sub { return [ $1, $2 ] if $a =~ /^\[(.+?)\].+id\:\s(.+),/; }  } )' '[Tue Feb 10 20:22:57 2015] [info] id: 17, text: "Hello"' 10000000
Benchmark: timing 10000000 iterations of A, B, C...
         A: 16 wallclock secs (12.88 usr +  0.00 sys = 12.88 CPU) @ 776397.52/s (n=10000000)
         B: 34 wallclock secs (26.74 usr +  0.01 sys = 26.75 CPU) @ 373831.78/s (n=10000000)
         C: 18 wallclock secs (14.72 usr +  0.00 sys = 14.72 CPU) @ 679347.83/s (n=10000000)
arto ★★
()
Ответ на: комментарий от habamax

Регулярки это мелочи:

>> parse "[Tue Feb 10 20:22:57 2015] [info] id: 17, text: Hello" [ "[" copy date to "]" thru "id: " copy id to "," to end]
== true
>> date
== "Tue Feb 10 20:22:57 2015"
>> id
== "17"
>> 
loz ★★★★★
()
Последнее исправление: loz (всего исправлений: 2)

Только начинаю работу с perl'ом.

Но зачем?

Nucleus-
()
Ответ на: комментарий от anonymous

О, расскажи говно ли моя грамматика для парсинга этой строки?

loz ★★★★★
()
Ответ на: комментарий от loz
>> "[Tue Feb 10 20:22:57 2015] [info] id: 17, text: Hello"
    =~ /^\[(?<date>.+?)\].+id: (?<id>.+),/;
>> say @+{date, id}
>> ($date, $id) = "[Tue Feb 10 20:22:57 2015] [info] id: 17, text: Hello"
    =~ /^\[(.+?)\].+id: (.+?),/;
>> say $date, $id;

лучше покажи реальный пример, где регулярки окажутся мелочью, а parse крупной банкнотой.

Deleted
()
Ответ на: комментарий от Deleted
>> rule: [copy time to "add" (time: make time! time) "add " copy n to " hour" (time: time + (3600 * to-integer n)) to end]
== [copy time to "add" (time: make time! time) "add " copy n to " hour" (time: time + (3600 * to-integer n)) to end]
>> parse "20:22 add 1 hour" rule
== true
>> time
== 21:22
>> parse "20:22 add 3 hours" rule
== true
>> time
== 23:22
>> parse "20:22 add 15 hours" rule
== true
>> time
== 35:22

loz ★★★★★
()
Ответ на: комментарий от loz

исходная строка, вытаскиваешь время, прибавляешь, отнимаешь. так?

Deleted
()
Ответ на: комментарий от loz

набрал в консоли: ./rebol

REBOL/Core 2.7.8.4.3 (6-Jan-2011)
Copyright 2011 REBOL Technologies
REBOL is a Trademark of REBOL Technologies
All rights reserved.

Finger protocol loaded
Whois protocol loaded
Daytime protocol loaded
SMTP protocol loaded
ESMTP protocol loaded
POP protocol loaded
IMAP protocol loaded
HTTP protocol loaded
FTP protocol loaded
NNTP protocol loaded


и всё. никакой ввод и вывод не работает. Что делать? Скачал Linux x86 libc6 2.5

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)

Щучий сын, почему ты считаешь что твоё время дороже чем время остальных, почему остальные поощряют идиотов?

fero ★★★★
()
Ответ на: комментарий от loz

Tue Feb 10 20:22:57 2015

че то я не понял, ты вводишь строку один в один. В каком месте ты парсишь? Ты просто ищешь точное совпадение.

anonymous
()
Ответ на: комментарий от anonymous
>> source parse      
parse: native [
    "Parses a series according to rules." 
    input [series!] "Input series to parse" 
    rules [block! string! none!] "Rules to parse by" 
    /all "Parses all chars including spaces." 
    /case "Uses case-sensitive comparison."
]

Где-то в нативе.

loz ★★★★★
()
Ответ на: комментарий от Deleted

Ввод/вывод не работает? Очень странно, может попробуй в другом эмуляторе терминала, на нескольких разных линуксах юзал - небыло такой проблемы.

loz ★★★★★
()
/\[([^\]]+).*\bid:\s*(\d+)/
chg ★★★★★
()

my ($date, $id) = ($line =~ /^\[(.*)\].\[.*\]\sid:\s(\d+).*$/);

anonymous
()
Ответ на: комментарий от habamax

Учи регулярки, пригодится не только в перле.

А чо их учить, есть ли сайты со шпорами тобишь примерами на любой вкус по регулярным выражениям?

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

да, есть, называется google или yandex

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.