Всем привет.
Сегодня я попрошу вас вспомнить, за что так сильно хвалят и ругают одновременно перл? Конечно, за регулярные выражения. С одной стороны — это мощный инструмент, способный в умелых руках сделать все, что угодно. Любые операции с любыми данными.
С другой стороны, регулярные выражения в перл — неюзабельный фарш из всевозможных символов, которые только можно придумать.
Задача Perl 6: сделать с ними что-нибудь. Давайте посмотрим, что же с ними сделали. Итак, «Регулярные выражения».
В Perl 6 регулярные выражения изменились. Но кое-что, все же, осталось неизменным. Давайте посмотрим и сравним.
* Все еще можно писать регулярные выражения между слэшами
* ?,+ и *? — квантификаторы
* (...) все еще используются для захвата значений
* Сокращения для классов символов: \d, \w, \s
* | используется для альтернативной подстановки (но семантика другая; для аналогичной Perl 5, используйте ||)
* все, что состоит из чисел, букв и знака подчеркивания — литералы
/foo_123/ # All literals
* Все остальное — синтаксис
* Используйте обратный слэш (\), чтобы превращать литералы в синтаксис, а синтаксис в литералы
/\<\w+\>/ # \< and \> are literals
# \w is syntax
Теперь об изменениях
* Все, что в Perl 5 делал модификатор x теперь — по умолчанию
* Это значит, что пробелы теперь ничего не значат, это теперь часть синтаксиса:
/abc/ # совпадение abc
/a b c/ # то же самое
Изменения: квотирование
* Одиночные кавычки заключают литералы, точно так же, как \'
* Поэтому можно переписать это
/\<\w+\>/
...немного проще:
/'<' \w+ '>'/
Пробелы внутри кавычек тоже работают:
/'a b c'/ # requires the spaces
Изменения: группировка
Группировка значений, не приводящая к захвату, описывается теперь как [...]
/[foo|bar|baz]+/
Классы символов теперь заключаются в такую конструкцию <[...]>. Они могут комбинироваться или взаимоисключаться, соответственно с помощью + или -
/<[A..Z]>/ # Строчные буквы...
/<[A..Z] - [AEIOU]>/ # ...но не гласные
/<[\w + [-]]> # все, что совпадает с \w, кроме a
Изменения: s и m
* Модификаторов s и m больше нет
* . теперь отвечает за все совпадения, включая перенос строки
* Используйте \N, чтобы вычислить совпадения без переноса строки
* ^ и $ всегда означают начало и конец строки
* Чтобы сравнить с конкретным примером, используйте ~~
if $event ~~ /\d**4/ { ... }
Исключающая форма !~~
if $event !~~ /\d**4/ { fail "no year"; }
$/ хранит совпавший объект
my $event = "Bulgarian Perl Workshop 2009";
if $event ~~ /\d**4/ {
say "Held in $/"; # Held in 2009
}
Именованные регулярные выражения
Теперь регулярные выражения можно объявлять поименно, как функции или методы
regex Year { \d**4 }; # 4 digits
Чтобы использовать, делаем так:
if $event ~~ /<Year>/ { ... }
Вы можете вызывать одни регулярные выражения из других
regex Year { \d**4 };
regex Place { Bulgarian | Ukrainian };
regex Workshop {
<Place> \s Perl \s Workshop \s <Year>
};
regex YAPC {
'YAPC::' ['EU'|'NA'|'Asia'] \s <Year>
};
regex Event { <Workshop> | <YAPC> };






































29 августа 2009, 08:37
К тому же, некоторые штуковины, которые позволяют PCRE (захват групп, например), следует делать с помощью нормального такого парсера. Собственно, в Перле от регулярных выражений осталось только одно название. :)