Всем привет.

Сегодня я попрошу вас вспомнить, за что так сильно хвалят и ругают одновременно перл? Конечно, за регулярные выражения. С одной стороны — это мощный инструмент, способный в умелых руках сделать все, что угодно. Любые операции с любыми данными.

С другой стороны, регулярные выражения в перл — неюзабельный фарш из всевозможных символов, которые только можно придумать.

Задача 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> };

shootnix
shootnix
26 августа 2009, 01:45
 1  
просмотров
757
2
 
chiaroscuro
29 августа 2009, 08:37
0
Хреново же. Perl-овские регулярки реализуются поиском с возвратом, и на определенных входных цепочках имеют экспоненциальное (!) время выполнения. Это значит, что на сопоставление может уйти как одна миллисекунда, так и один год.

К тому же, некоторые штуковины, которые позволяют PCRE (захват групп, например), следует делать с помощью нормального такого парсера. Собственно, в Перле от регулярных выражений осталось только одно название. :)
Чтобы оставлять комментарии, Вы должны быть авторизованы. Если у Вас нет логина, то пройдите регистрацию.
участники
shootnix
Rex
edmond-mouse
mikusya
Legend_FoX
PeterWilson
askhattk
barmaglot
wwax
tima888
t-sh
Sigurt
zloyrusskiy
goodev
10275
PILIGRIM
войти
зарегистрироваться
сообщества
последние записи
записи по обсуждениям
записи по рейтингу
создать новое сообщество
личные блоги
последние записи
записи по обсуждениям
люди
самые активные
новые
по городам
по интересам
блог проекта
правила участия
помощь
мы на других сайтах
реклама
конкурсы
контакты
WebEverywhere, 2008-2010

Lyakhov.KZ - Большая энциклопедия Казнета Lyakhov.KZ - Большая энциклопедия Казнета