Perl 6 делает довольно революционный шаг вперед в удобочитаемости регулярных выражений. Рассмотрим адрес формы:
100 E Main St Springfield MA 01234
Вот умеренно читаемое регулярное выражение, совместимое с Perl 5, для анализа этого (многие угловые случаи не обрабатываются):
m/
([1-9]\d*)\s+
((?:N|S|E|W)\s+)?
(\w+(?:\s+\w+)*)\s+
(ave|ln|st|rd)\s+
([:alpha:]+(?:\s+[:alpha:]+)*)\s+
([A-Z]{2})\s+
(\d{5}(?:-\d{4})?)
/ix;
Это регулярное выражение Perl 6 имеет такое же поведение:
grammar USMailAddress {
rule TOP { <addr> <city> <state> <zip> }
rule addr { <[1..9]>\d* <direction>?
<streetname> <streettype> }
token direction { N | S | E | W }
token streetname { \w+ [ \s+ \w+ ]* }
token streettype {:i ave | ln | rd | st }
token city { <alpha> [ \s+ <alpha> ]* }
token state { <[A..Z]>**{2} }
token zip { \d**{5} [ - \d**{4} ]? }
}
Грамматика Perl 6 - это класс, и все токены являются вызываемыми методами. Используйте это так:
if $addr ~~ m/^<USMailAddress::TOP>$/ {
say "$<city>, $<state>";
}
Этот пример взят из выступления , которое я представил на семинаре Frozen Perl 2009 . Реализация Rakudo в Perl 6 достаточно завершена, чтобы этот пример работал сегодня.