PERL: БИБЛИОТЕКА ПРОГРАММИСТА


PERL: БИБЛИОТЕКА ПРОГРАММИСТА - стр. 173


Принцип жадности: если квантификатор (например, *) может совпасть в не­скольких вариантах, он всегда совпадает со строкой наибольшей длины. Объяс­нения приведены в рецепте 6.15.

Принцип торопливости: механизм поиска старается обнаружить совпадение как можно скорее, иногда даже раньше, чем вы ожидаете. Рассмотрим конструк­цию Fred =" /x*/. Если попросить вас объяснить ее смысл, вы, вероятно, скаже­те. «Содержит ли строка Fred символы х?» Вероятно, результат поиска окажет­ся неожиданным — компьютер убежден, что символы присутствуют. Дело в том, что /х*/ означает не просто «символы х», а «любое количество символов х». Или более формально — ноль и более символов. В данном случае нетерпеливый меха­низм поиска удовлетворяется нулем.

Приведем более содержательный пример:

$string =    good food Sstring =~ s/o*/e/

Как вы думаете, какое из следующих значений примет $string после подстановки?

goof   food geod   food geed   food geed   feed ged   food ged   fed egood   food

Правильный ответ — последний, поскольку первая точка, в которой встречает­ся ноль и более экземпляров о , находится прямо в начале строки. Удивлены? С регулярными выражениями это бывает довольно часто.

А теперь попробуйте угадать, как будет выглядеть результат при добавлении модификатора /д, который делает подстановку глобальной? Строка содержит много мест, в которых встречается ноль и более экземпляров о , — точнее, восемь. Итак, правильный ответ —   egeede efeede .

Приведем другой пример, в котором жадность уступает место торопливости:

% echo ababacaca | perl -ne print $&\n if /(a|ba|b)+(a|ac)+/ ababa

Это объясняется тем, что при поиске в Perl используются так называемые тра­диционные неопределенные конечные автоматы (в отличие от неопределенных конечных автоматов POSIX). Подобные механизмы поиска гарантируют возврат не самого длинного общего совпадения, а лишь самого длинного левого совпаде-


182   Глава б • Поиск по шаблону

ния. Можно считать, что жадность Perl проявляется лишь слева направо, а не в глобальном контексте.




- Начало -  - Назад -  - Вперед -