Построение эффективных регулярных выражений. Оператор qr/…/ и объекты регулярных выражений.
10.1.2. Оператор qr/…/ и модификаторы
Объект регулярного выражения компилируется вместе со своими модификаторами, эти режимы поиска "вшиваются" в откомпилированное регулярное выражение, и их нельзя потом изменить. Пример:
$_='aB'; my $re=qr/[a-z]+/; print $& if /$re/;
Идет поиск с учетом регистра символов, на печать выводится a. Модификаторы, находящиеся снаружи объекта регулярного выражения, не могут повлиять на его работу:
print $& if /$re/i; print $& if /(?i)$re/; print $& if /(?i:$re)/i;
Все равно выводится только буква a. Модификатор должен стоять в самом операторе, который возвращает объект регулярного выражения:
$_='aB'; my $re=qr/[a-z]+/i; print $& if /$re/;
Теперь печатается aB.
Верно и обратное: режимы поиска, которые были установлены внутри объекта регулярного выражения, не влияют на остальную часть регулярного выражения, в которое входит этот объект. Пример:
$_='aB'; my $re=qr/(?i)[a-z]+/; print $& if /${re}b/;
Ничего не напечатается, т.к. режим поиска без учета регистра (?i) не действует вне объекта регулярного выражения $re. Здесь фигурные скобки, окружающие имя переменной, отделяют ее от последующих букв так же, как и в случае с интерполяцией переменных. Следующий пример:
$_='aB'; my $re=qr/(?i)[a-z]+/; print $& if /${re}B/;
напечатает aB.
10.1.3. Объекты регулярных выражений и квантификаторы
Как вы помните, при поиске и подсветке ссылок в тексте нам приходилось заключать в скобки регулярные выражения, которые находились в переменных, чтобы квантификаторы в общем регулярном выражении относились ко всему вставляемому подшаблону, а не к последнему его символу. В случае использования объектов регулярных выражений такой проблемы нет, они ведут себя так, как если бы были заключены в незахватывающие скобки:
$_='abab'; my $re=qr/ab/; print $& if /$re+/;
Напечатается abab. В случае с интерполяцией текста в регулярное выражение:
$_='abab'; my $re='ab'; print $& if /$re+/;
напечатается только ab, т.е. плюс относится лишь к последнему символу b.