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

m


       Что с регулярными выражениями (регексами)? Вроде бы они претерпели серьёзные изменения. Будем потихоньку разбираться. Теперь для поиска по шаблону надо использовать ~~:
    
#!/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


       Вроде бы метасимволы не очень изменились в регулярных выражения. \w по-прежнему означает букву, цифру или подчеркивание. \W означает все другие символы. И так далее... Попробуем основные метасимволы.
    
#!/usr/bin/perl6
my $abc='perl6.su - здесь осваиваю язык perl_6. ';
if ($abc ~~ m/(\w+)/) {
	$0.say;
	}

       Поиск дошел до точки, которая не "буква", и остановился. А как насчёт русских букв?
    
#!/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;
	}

       \d означает цифру.
    
#!/usr/bin/perl6
my $abc='perl6.su - здесь осваиваю язык perl_6. ';
if ($abc ~~ m/(\d+)/) { $0.say; }

       Интересно, что в "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; }

       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

   ~~, регулярные выражения, метасимволы, именованные регексы, m      charta situs       nota XVI, nota XVII, nota XXV, nota XXXV   

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