Теперь все ясно, только откуда
Совпадение найдется без предупреждений, и на печати окажется
[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$/;
Не найдено!
Содержание Назад Вперед
Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий