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


         

захвачен пустой фрагмент текста.


Будет напечатано:

|a|bc 0

Текущий фрагмент совпадения $& равен a, а в $ 1 захвачен пустой фрагмент текста. Как будто бы это ошибка, но на самом деле ошибки в этом примере нет. Вначале квантификатор ? получает значение 1, квантификатор * тоже получает значение 1.

Происходит совпадение скобок с буквой a. Затем квантификатор * заставит подшаблон в скобках сделать повтор с позиции 1 (за буквой a), и в результате будет найдено совпадение нулевой длины для a с квантификатором ?, равным нулю. При этом переменная $1 обновится и получит пустое значение. В следующем повторе зафиксируется нулевая длина совпадения, и выполнение оператора поиска принудительно прервется. Если переписать этот пример в виде

print "$`|$&|$'\n" if 'abc' =~ /(?:(a?)(?{print 'pos='.pos($_).", text='$1'\n"}))*/; print length $1;

и посмотреть, что будет напечатано:

pos=1, text='a' pos=1, text='' |a|bc 0

то алгоритм работы системы поиска в этом примере станет ясен. Это немного напоминает уже рассмотренный пример

$_=':abc:'; print "$& $1" if /(\w)+/;

где вместо квантификатора * стоит квантификатор +. Этот пример напечатает

abc c


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





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