Опубликован: 18.06.2007 | Доступ: свободный | Студентов: 1420 / 43 | Оценка: 4.14 / 3.29 | Длительность: 12:44:00
ISBN: 978-5-94774-604-4
Лекция 7:

Интерполяция переменных и метасимволы \U, \u, \L, \l, \Q, \E

< Лекция 6 || Лекция 7: 123456 || Лекция 8 >
$_='a';
print "Founf $&" if /^\Q\LA\E\E$/;

Напечатает

Found a

Но если убрать символ $, то в первом случае поиск тоже будет успешным:

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

Напечатает

Found a

Мы видим, что в первом примере, где ничего не было найдено, метапоследовательность \E соответствовала метапоследовательности \L, а для \Q не было своего завершителя \E, поэтому символ $ стоял внутри экранируемого литерала регулярного выражения и он уже не означал конца текста, а означал просто символ доллара. Следующий пример это наглядно демонстрирует:

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

Печатает

Found a$

Замечу еще, что пустая метапоследователность \Q\E вызывает ошибку синтаксиса, так же как и \U\E и \L\E. Комбинации \U\L и \L\U также почему-то вызывают ошибки синтаксиса.

Внутри классов все эти метапоследовательности \u, \l, \U…\E, \L…\E, \Q…\E также работают. Вот примеры:

$_='A';
print $& if /[\ua]/;

Напечатает A.

$_='AB]';
print $& if /[\Ua]b\E]/;

Напечатает AB].

Здесь обратите внимание на "сквозное" действие метапоследовательности \U…\E, которая продолжает действовать за пределами класса. Ведь рассматриваемые метапоследовательности применяются сразу после интерполяции переменных, поэтому механизм поиска соответствия получит регулярное выражение /[A]B]/.

Вот пример полезной идиомы: в переменной $name задано имя человека буквами произвольного регистра. Мы с помощью последовательности \u\L в любом случае делаем первую букву заглавной, а остальные - строчными:

$_='Andrey';
my $name='aNDreY';
print $& if /\u\L$name\E/;

Напечатает Andrey.

Внутри классов это тоже работает:

$_='Andrey';
my $name='aNDreY';
print $& if /[\u\L$name\E]{6}/;

Будет напечатано Andrey. Регулярное выражение будет иметь вид /[Andrey]{6}/.

Еще раз заметим, что внутри переменных эти метапоследовательности не распознаются.

Например:

#!/usr/bin/perl -w
use strict;

$_='A';
my $name='\\ua';
print $& if /$name/;

Возникает сообщение:

Unrecognized escape \u passed through in regex; 
    marked by <-- HERE in m/\u <-- HERE a/ at a.pl line 6.

В регулярное выражение мы передали строку \ua. Но в интерполируемых переменных рассматриваемые метапоследовательности не работают.

Сделаю еще одно замечание насчет использования \u, \l, \U…\E и \L…\E. В документации алгоритм их работы не разъяснен, не написано, какую ассоциативность имеют эти операторы - левую или правую. Ведь их действия могут конфликтовать друг с другом. К примеру, какой напечатается строка "\Ua\lAa"? Эскейп-последовательность \l говорит, что следующая буква A будет прописной, а \U говорит, что все после нее до конца строки будет заглавным. В итоге напечатается AAA. Зесь мы видим, что эти операторы имеют правую ассоциативность, т.е. выполняются справа налево. То же справедливо, когда рядом стоят символы \l\u и \u\l. Однако, если вместе стоят символы \U\l, \l\U, \L\u и \u\L, то префиксы \l и \u имеют приоритет перед метасимволами \L и \U. Сравните результаты:

print "\L\uaA\n";
print "\LaA\uaA\n";

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

Aa
aaaa

В первом случае \u перебивает действие \L, а во втором случае, когда между \L и \u стоят символы, - нет.

И в конце отмечу, что операторы \U, \u, \L, \l, если установлена локаль, работают с учетом локальных установок, т.е. также с буквами национальных алфавитов.

Если регулярное выражение ограничено апострофами, то в нем метапоследовательности для литерального текста \Q…\E, операторы интервального изменения регистра букв \U…\E и префиксы изменения регистра букв \u, \l не работают. А также внутри такого регулярного выражения не интерполируются переменные.

< Лекция 6 || Лекция 7: 123456 || Лекция 8 >
Гулзира Урбисинова
Гулзира Урбисинова
Сергей Крупко
Сергей Крупко

Добрый день.

Я сейчас прохожу курс  повышения квалификации  - "Профессиональное веб-программирование". Мне нужно получить диплом по этому курсу. Я так полагаю нужно его оплатить чтобы получить диплом о повышении квалификации. Как мне оплатить этот курс?