perl6.suОсвоим perl6 к 2015 году!

регулярные выражения


       Что с регулярными выражениями (регексами)? Вроде бы они претерпели серьёзные изменения. Будем потихоньку разбираться. Теперь для поиска по шаблону надо использовать ~~:
    
#!/usr/bin/perl6
my $text='Anno 2010. perl6.su stiti. ';
if ($text ~~ m/(\d\d\d\d)/) {
	$0.say;
	}

       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;
	}

       Вот. Всяческие пробелы сейчас служат украшательским целям в первую очередь:
    
#!/usr/bin/perl6
my $text='Anno 2010. perl6.su stiti. ';
if ($text ~~ m/
		( \d\d\d\d )
		.+
		( \d+ )
		/
	) {
	$0.say;
	$1.say;
	}

       А если так?
    
#!/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}

       Понятно. А если так?
    
#!/usr/bin/perl6
my $text='Ave Maria, gratia plena.';
if $text ~~ m/ (M...a) .+ (p...a)  / {$/.say}

       Ясно.
# 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}

       Так.
       Можно использовать двоеточие как диапазон:
    
#!/usr/bin/perl6
my $textus='O sancta simplicitas!';
if $textus ~~ m/ (<[h..m]>+) / {$0.say}

       А как с кириллицей?
    
#!/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

   ~~, регулярные выражения, m      charta situs       nota XVI, nota XVII, nota XXVI, nota XXVII   

    RSS     stdin@perl6.su    © Alexius Karmanov, 2010-2011