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


         

Экранирование метасимволов регулярных выражений - часть 2


Совпадение найдется без предупреждений, и на печати окажется

[a]bc?E$?

Теперь все ясно, только откуда взялся последний знак вопроса? Дело в том, что специальная переменная $\ содержит текст, который оператор print использует как завершитель выходных записей и добавляет после своего вывода, - вот он этот текст и добавил.

Получается, что символы $ и @ внутри последовательности \Q…\E будут интерполироваться, если за ними следуют символы, которые встречаются в именах переменных или специальных переменных. А если, как у нас, после $ будет пробел, то тогда символы $ и @ будут обозначать сами себя. Ничего не даст попытка экранировать их обратным слэшем: \Q\$a\E - этот обратный слэш будет сам экранирован внутри последовательности \Q…\E, и мы получим фрагмент текста $a.

Но внутри переменных интерполяция переменных не происходит, также в них не распознаются метасимволы \Q и \E литералов регулярных выражений:

$_='[a]\\Qbc$\\'; my $a='[a]\\Qbc$\\'; print $& if /^\Q$a\E$/;

На печать выходит

[a]\Qbc$\

Также внутри блоков \Q…\E работают метасимволы литералов регулярных выражений \U, \u, \L и \l.

  • \L означает, что все буквы до эскейп-последовательности \E или до конца литерала регулярного выражения будут прописными.
  • \l означает, что следующий символ, если он буква, будет прописным.
  • \U означает, что все буквы до эскейп-последовательности \E или до конца литерала регулярного выражения будут заглавными.
  • \u означает, что следующий символ, если он буква, будет заглавным.

Например:

$_='abc'; my $a='ABC'; print $& if /^\L$a/;

Будет напечатано abc.

Или

$_='abc'; print $& if /^\LABC/;

Здесь также напечатается abc.

Обратите внимание на такой нюанс:

$_='a'; print "Found $&" if /^\Q\LA\E$/;

Не найдено!




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