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


         

В первом примере обратная ссылка


напечатается

abc111abc abc

В первом примере обратная ссылка \1 имела значение 1, а во втором - abc, т.е. стала относиться к нумерованной переменной из другого объекта регулярного выражения.

В принципе, в этих двух случаях может помочь переменная $^N, которая дублирует значение нумерованной переменной, соответствующей последней только что закрытой паре захватывающих скобок. Если вам надо сохранить значение нумерованной переменной, то сразу после того, как закроется ее скобка, вставьте код Perl

(?{ $s=$^N })

и последнее значение нумерованной переменной сохранится во внешней переменной $s.

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

(??{ код Perl })

Возвращаемое значение этого кода Perl интерпретируется как текст и как часть общего регулярного выражения.

В последнем примере можно записать так:

$_='abc111abc'; my $re1=qr/([a-z]+)/; my $re2=qr/(\d+)(??{$^N})/; print "$&\n$1" if /$re1$re2/;

На печати получим

abc11 abc

Отсюда видим, что динамическое регулярное выражение (??{$^N}) соответствует обратной ссылке \2. Как и во встроенном коде Perl, в динамических регулярных выражениях переменные не интерполируются при компиляции шаблона, а каждый раз вычисляются заново. Другое дело, что динамические регулярные выражения и встроенный код Perl требуют увеличения времени на работу регулярного выражения.


Содержание  Назад  Вперед





Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий