LINUX.ORG.RU

Perl: RegEx: Самый правильный способ сделать это?


0

1

[code]
$b=«Tra lala 1234 The end»;
@a=(1,2,3,4);
$_=join(«|»,@a);
$b=~m/^.*($_)+.*$/ && print «hello\n»;
[/code]
Не просто часто, а очень часто (и не только в Perl, разумеется) встречается ситуация, когда есть некий список и нужно его вставить как часть регулярного выражения в виде (a[0]|a[1]|a[2])
Функция join делает свою работу на отлично, но внутри регэкспа она не раскрывается, приходится прибегать к дополнительному присваиванию. А как сделать проще? По-моему был раньше модификатор /e (от evaluate), но в современном перле это не работает. Скобки вида (?{join(та-та-та)}) тоже не катят.. Так что, оставить как есть?

P.S. Знаю, что есть grep, но это _очень_ частный случай, а как в более общем случае вставлять возврат функций в регэкспы?

★★★★★

Цитата из perldoc perlop

                   $_ = 'abc123xyz';
                   s/\d+/$&*2/e;               # yields 'abc246xyz'
                   s/\d+/sprintf("%5d",$&)/e;  # yields 'abc  246xyz'
                   s/\w/$& x 2/eg;             # yields 'aabbcc  224466xxyyzz'

Понял, почему у тебя /e не работает? Попробуй ещё оператор qr//, может понравится.

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

Так это оно для s/// получается? А в левой части использовать нельзя? Мдя, а вот на BASH можно, BASH круче! :)

DRVTiny ★★★★★
() автор топика

А вот так?

/^.*(${ \(join("|", @a)) })+.*$/;

Причем таким образом можно производить интерполяцию функций не только внутри оператора регулярных выражений, но и в обычной строке. Для функций возвращающих список, а не скаляр запись немного отличается.

Olegymous ★★★
()
Ответ на: А вот так? от Olegymous

Ну вы монстр! Причём работает именно так, как написали: я сначала думал, что обратный слэш перед скобкой - опечатка, ан нет - всё верно. Где о таких классных нестандартных штуках почитать можно?

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