
~~
Что с регулярными выражениями (регексами)? Вроде бы они претерпели серьёзные изменения. Будем потихоньку разбираться. Теперь для поиска по шаблону надо использовать ~~:
| | #!/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
Нам предстоит ещё долго разбираться со 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'; | | Bool::True
Bool::False
Bool::False
Bool::True
Bool::False
Bool::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'; | | Bool::True
Bool::False
Bool::False
Bool::True
Bool::True
Bool::False
Bool::False |
Ergo в простом виде, без модификаторов, ~~ работает как простое сравнение вроде == или eq, но не обращающее внимание на тип данных. В "Using perl 6" написано, что $answer ~~ 42 это то же самое, что 42.ACCEPTS($answer).| | #!/usr/bin/perl6
my $answer=42;
say $answer ~~ 42;
say 42.ACCEPTS($answer); | | Bool::True
Bool::True |
Надо же, и в самом деле существует загадочный метод ACCEPTS. Видимо, он отвечает на вопрос: принимает ли объект 42 объект $answer. # mutatio postrema: 30 Jan 2012
|