Регулярные выражения Perl и их применение

       

Модификатор e в операторе замены


Оператор замены поддерживает модификатор e (Evaluation), которого нет в операторе поиска. В этом случае операнд для замены рассматривается как фрагмент кода Perl, который каждый раз во время замены выполняется аналогично функции eval, а полученный в скалярном контексте результат подставляется вместо найденного фрагмента текста. Это дает большую гибкость при замене текста. Более того, модификатор e может повторяться несколько раз, что влечет многократное применение функции eval к результату (столько раз, сколько раз повторен модификатор e). Заметим, что остальные модификаторы тоже могут повторяться, но это не влечет каких-либо последствий.

Рассмотрим такой пример на замену переменных их значениями.

my $a='a'; $_='This is $a'; s/(\$\w+)/$1/; print;

В результате будет напечатано

This is $a

В захватывающие скобки попала подстрока $a, операнд $1='$a' был интерполирован по правилам строк в кавычках и в результате интерполяции получился текст '$a', который и заменил найденный фрагмент текста '$a', т.е. сам себя.

Теперь к оператору замены добавим модификатор e:

my $a='a'; $_='This is $a'; s/(\$\w+)/$1/e; print;

В результате получается тот же вывод:

This is $a

Как это объяснить? Теперь операнд для замены $1='$a' был выполнен как код Perl, в результате получилась строка '$a', которая опять заменила саму себя.

Добавим еще один модификатор e:

my $a='a'; $_='This is $a'; s/(\$\w+)/$1/ee; print;

В результате получается текст

This is a

В этом случае после выполнения кода Perl $1 получается строка '$a', которая опять выполняется как код Perl, что и дает ее значение 'a'.

Теперь принцип ясен, мы можем продолжить эту аналогию и написать такую загадочную программу:

my $b='b'; my $a='$b'; $_='This is $a'; s/(\$\w+)/$1/eee; print;

В результате выводится текст

This is b

Но вряд ли кому-либо на практике придется применять модификатор e больше двух раз.



Содержание раздела