Entry tags:
Look-Around Assertions в операторе s///
До сих пор не задумывался на эту тему, но работает. Пример:
Задание: Удалить все знаки «+», за которыми следует цифра.

Задание: Удалить все знаки «+», за которыми следует цифра.
# perl -le '$ARGV[0] =~ s#\+(?=\d)##g && print $ARGV[0]' "+test + +12 +13 ++"
+test + 12 13 ++
#

Entry tags:
сравнение скорости регулярного выражения и поиска в хеше
используем конструкцию (??{ code }); perldoc perlre
( под кат )
резюме: на больших массивах имеет смысл использовать поиск через хеш.
update: при модификаторе /о регулярное выражение выигрывает у хеша, но до определенного размера.
( под кат )
резюме: на больших массивах имеет смысл использовать поиск через хеш.
update: при модификаторе /о регулярное выражение выигрывает у хеша, но до определенного размера.
Size: 16384
Benchmark: timing 1000000 iterations of A, B...
A: 5 wallclock secs ( 4.58 usr + -0.01 sys = 4.57 CPU) @ 218818.38/s (n=1000000)
B: 0 wallclock secs ( 0.90 usr + 0.02 sys = 0.92 CPU) @ 1086956.52/s (n=1000000)
Size: 32768
Benchmark: timing 1000000 iterations of A, B...
A: 5 wallclock secs ( 4.55 usr + 0.00 sys = 4.55 CPU) @ 219780.22/s (n=1000000)
B: 239 wallclock secs (237.26 usr + 0.37 sys = 237.63 CPU) @ 4208.22/s (n=1000000)
Entry tags:
разбор заголовка e-mail
my @head = split "(?ms)\r?\n(?!\\s)",do { local $/ = ""; <STDIN> };
в
@head
— строки из заголовка письма, со всеми переносами.тело письма дальше в stdin, можно читать и построчно.
Entry tags:
Работа с именованными группами в регулярных выражениях perl.
синтаксис:
( Пример разбора access_log )
(?<name>выражение)
, обратная ссылка \k<name>
, ссылка в коде $+{name}
.( Пример разбора access_log )
Entry tags:
rfc 822 mail address parser
# perl -MEmail::Valid -MGraphViz::Regex -e \
'GraphViz::Regex->new ($Email::Valid::RFC822PAT)->as_png ($ARGV[0]);' /tmp/rfc822pat.png
(большое, ~1M)
'GraphViz::Regex->new ($Email::Valid::RFC822PAT)->as_png ($ARGV[0]);' /tmp/rfc822pat.png
(большое, ~1M)