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


       Нам предстоит ещё долго разбираться со smart matching, который обозначается двумя тильдами. Мы уже пробовали поиск ~~ m//. А что делают две тильды в чистом виде?
    
#!/usr/bin/perl6
my $a=8;
say $a ~~ 8;
$a=7;
say $a ~~ 8;
$a=78;
say $a ~~ 8;
$a=8;
say $a ~~ '8';
$a='perl8.su';
say $a ~~ '8';
$a='perl6.su';
say $a ~~ '8';
True
False
False
True
False
False

       А теперь почти то же самое, но без переменных.
    
#!/usr/bin/perl6
say 8 ~~ 8;
say 7 ~~ 8;
say 78 ~~ 8;
say 8 ~~ '8';
say '8' ~~ 8;
say 'perl8.su' ~~ '8';
say 'perl6.su' ~~ '8';
True
False
False
True
True
False
False

       Ergo в простом виде, без модификаторов, ~~ работает как простое сравнение вроде == или eq, но не обращающее внимание на тип данных.
       В "Using perl 6" написано, что $answer ~~ 42 это то же самое, что 42.ACCEPTS($answer).
    
#!/usr/bin/perl6
my $answer=42;
say $answer ~~ 42;
say 42.ACCEPTS($answer);
True
True

       Надо же, и в самом деле существует загадочный метод ACCEPTS. Видимо, он отвечает на вопрос: принимает ли объект 42 объект $answer.
# mutatio postrema: 30 Jan 2012

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

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