
m
Что с регулярными выражениями (регексами)? Вроде бы они претерпели серьёзные изменения. Будем потихоньку разбираться. Теперь для поиска по шаблону надо использовать ~~:
| | #!/usr/bin/perl6
my $text='Anno 2010. perl6.su stiti. ';
if ($text ~~ m/(\d\d\d\d)/) {
$0.say;
} | | => <2010>
|
Bene. Легко заметить, что $1 теперь $0:| | #!/usr/bin/perl6
my $text='Anno 2010. perl6.su stiti. ';
if ($text ~~ m/(\d\d\d\d).+(\d+)/) {
$0.say;
$1.say;
} | | => <2010>
=> <6>
|
Вот. Всяческие пробелы сейчас служат украшательским целям в первую очередь:| | #!/usr/bin/perl6
my $text='Anno 2010. perl6.su stiti. ';
if ($text ~~ m/
( \d\d\d\d )
.+
( \d+ )
/
) {
$0.say;
$1.say;
} | | => <2010>
=> <6>
|
А если так?| | #!/usr/bin/perl6
my $text='NotaBene';
if ($text ~~ m/ Nota Bene /) {
'N.B.'.say;
} | | N.B. |
Теперь только цифро-буквы плюс подчеркивание означают сами себя. Остальное надо экранировать или заключать в кавычки.| | #!/usr/bin/perl6
my $text='NotaBene';
if ($text ~~ m/ Nota' 'Bene /) { 'N.B.'.say }
else {'P.S.'.say} | | P.S. |
Иногда удобнее может быть так:| | #!/usr/bin/perl6
my $text='NotaBene';
if ($text ~~ m/ 'Nota Bene' /) { 'N.B.'.say }
else {'P.S.'.say} | | P.S. |
N.B. В регулярных выражениях 'Nota Bene' и 'Nota\ Bene' разные вещи. # mutatio postrema: 18 Sep 2010
В переменную $/ записывается последнее удачное сопоставление в поиске по шаблону:
| | #!/usr/bin/perl6
my $text='Ave Maria, gratia plena.';
if $text ~~ m/ M...a / {$/.say} | | => <Maria>
|
Понятно. А если так?| | #!/usr/bin/perl6
my $text='Ave Maria, gratia plena.';
if $text ~~ m/ (M...a) .+ (p...a) / {$/.say} | | => <Maria, gratia plena>
0 => <Maria>
1 => <plena>
|
Ясно. # mutatio postrema: 17 Aug 2010
Вроде бы метасимволы не очень изменились в регулярных выражения. \w по-прежнему означает букву, цифру или подчеркивание. \W означает все другие символы. И так далее... Попробуем основные метасимволы.
| | #!/usr/bin/perl6
my $abc='perl6.su - здесь осваиваю язык perl_6. ';
if ($abc ~~ m/(\w+)/) {
$0.say;
} | | => <perl6>
|
Поиск дошел до точки, которая не "буква", и остановился. А как насчёт русских букв?| | #!/usr/bin/perl6
my $abc='perl6.su - здесь осваиваю язык perl_6. ';
if ($abc ~~ m/'- ' (\w+)/) {
$0.say;
} | | => <здесь>
|
Sic! Просто великолепно. По умолчанию кириллица это тоже теперь буквы. А если попробовать \W?| | #!/usr/bin/perl6
my $abc='perl6.su - здесь осваиваю язык perl_6. ';
my @fragm=$abc.split(/\W+/);
for @fragm {.say} | | perl6
su
здесь
осваиваю
язык
perl_6
|
Совершенно всё тут понятно. Точка означает любой символ.| | #!/usr/bin/perl6
my $abc='perl6.su - здесь осваиваю язык perl_6. ';
if ($abc ~~ m/(.+)/) {
$0.say;
} | | => <perl6.su - здесь осваиваю язык perl_6. >
|
\d означает цифру.| | #!/usr/bin/perl6
my $abc='perl6.su - здесь осваиваю язык perl_6. ';
if ($abc ~~ m/(\d+)/) { $0.say; } | | => <6>
|
Интересно, что в "Using perl 6" написано, что \d соответствует не только индийским цифрам, но и латинским.| | #!/usr/bin/perl6
my $abc='nota XXV. Пробуем метасимволы';
if ($abc ~~ m/(\d+)/) {
$0.say;
}
else {"Hic numeri non sunt".say} | | Hic numeri non sunt |
Это шутка, как оказалось. Хотя, видимо, можно поставить какой-то модифицирующий ключ... \N означает все символы кроме символа новой строки.| | #!/usr/bin/perl6
my $abc='perl6.su - здесь осваиваю язык perl_6. ';
if ($abc ~~ m/(\N+)/) { $0.say; } | | => <perl6.su - здесь осваиваю язык perl_6. >
|
N.B. Надо найти список всех возможных метасимволов. # mutatio postrema: 26 Aug 2010
Мы уже пробовали грамматики. Оказывается, есть их более простое подобие - именованные регулярные выражения. В "Using perl 6" дается такой пример регекса "слово".
| | #!/usr/bin/perl6
my regex word { \w+ [ \' \w+ ]? } # определение того, что такое слово
# слово это любое количество букв, в которое может затесаться
# один и только один апостроф '
my @verba=<пылесос China plan9 :-) dog's ha'ha ах'ах'ах ну-ну>;
for @verba {
if m/ ^ <&word> $ / { "$_ verbum est".say }
else {"$_ non verbum est".say}
} | | пылесос verbum est
China verbum est
plan9 verbum est
:-) non verbum est
dog's verbum est
ha'ha verbum est
ах'ах'ах non verbum est
ну-ну non verbum est |
Это очень мощная возможность в плане повышения читабельности программы. Также можно коллекционировать регексы для быстрой вставки потом в новые программы. В одном именованном регексе можно использовать другой именованный регекс. # mutatio postrema: 27 Aug 2010
|