
регулярные выражения
Что с регулярными выражениями (регексами)? Вроде бы они претерпели серьёзные изменения. Будем потихоньку разбираться. Теперь для поиска по шаблону надо использовать ~~:
| | #!/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
Чтобы задать список символов, которые мы ищем надо сделать так:
| | #!/usr/bin/perl6
my $textus='O sancta simplicitas!';
if $textus ~~ m/ (<[xyz]>+) / {$0.say}
else {'xyz не найден'.say}
$textus='Ex mero motu';
if $textus ~~ m/ (<[xyz]>+) / {$0.say}
else {'xyz не найден'.say} | | xyz не найден
=> <x>
|
Так. Можно использовать двоеточие как диапазон:| | #!/usr/bin/perl6
my $textus='O sancta simplicitas!';
if $textus ~~ m/ (<[h..m]>+) / {$0.say} | | => <im>
|
А как с кириллицей?| | #!/usr/bin/perl6
my $textus='Суета сует. Суета сует. И всё суета...';
if $textus ~~ m/ (<[а..к]>+) / {$0.say} | | => <е>
|
С буквой "ё" надо так:| | #!/usr/bin/perl6
my $textus='Суета сует. Суета сует. И всё суета...';
if $textus ~~ m/ (<[ёж..к]>+) / {$0.say}
else {'Нету'.say} | | => <ё>
|
Это связано с тем, что ё на самом деле не находится в юникоде в ряду а..я.| | #!/usr/bin/perl6
my $textus='Sueta suet. Sueta suet. I vsё sueta...';
if $textus ~~ m/ (<[а..я]>+) / {$0.say}
else {'Нету'.say} | | Нету |
N.B. Наш алфавит включает 32 буквы + одна буква 'ё' Если наоборот, мы задаём blacklist из букв, тогда отрицание делается как -[]| | #!/usr/bin/perl6
my $textus='Sueta suet. Sueta suet. I vsё sueta...';
if $textus ~~ m/ (<-[A..Za..z\ \.]>+) / {$0.say}
else {'Нету'.say} | | => <ё>
|
Bene. # mutatio postrema: 30 Jan 2012
Если мы ищем символы из списков [a..z] и [а..я], то их можно объединить так [a..zа..я]. Но можно и так: [a..z]+[а..я]
| | #!/usr/bin/perl6
my $textus='Как говорится, sic transit gloria mundi';
$textus ~~ s:g/<[a..z]+[а..я]>/?/;
$textus.say; | | К?? ?????????, ??? ??????? ?????? ????? |
Да. Но ведь эти списки можно ещё и вычитать!| | #!/usr/bin/perl6
my $textus='Как говорится, sic transit gloria mundi';
$textus ~~ s:g/<[a..z]+[а..я]-[с..я]-[g..o]>/?/;
$textus.say; | | К?? ??????тся, ?i? ???n?i? glo?i? m?n?i |
Забавно. А если начать с минуса?| | #!/usr/bin/perl6
my $textus='Как говорится, sic transit gloria mundi';
$textus ~~ s:g/<-[a..z]>/?/;
$textus.say; | | ???????????????sic?transit?gloria?mundi |
То есть, когда начинаешь с минуса, тогда получается, что из почти бесконечного списка всяческих символов мы отнимаем a..z. А если потом ещё отнять?| | #!/usr/bin/perl6
my $textus='Как говорится, sic transit gloria mundi';
$textus ~~ s:g/<-[a..z]-[т..я]>/?/;
$textus.say; | | ??????????т?я??sic?transit?gloria?mundi |
Просто красота. # mutatio postrema: 26 Aug 2010
|