17. Модификаторы в регексах Perl 6 vs. Perl 5

Добрый вечер! Тема сегодняшнего поста — как правильно ставить модификаторы в регексах Perl 6, если вы знакомы с регулярными выражениями Perl 5.

В целом все просто: если раньше буквы типа i ставились после регулярного выражения, то теперь — перед:

Было:

say 'A' =~ /a/i; # 1

Стало:

say 'A' ~~ m:i/a/; # 「A」

Возможен и второй вариант, когда модификатор ставится внутрь:

В Perl 5 было:

say 'A' =~ /(?^i)a/; # 1

В Perl 6 стало:

say 'A' ~~ /:i a/; # 「A」

Во втором случае пробел перед буквой не изменяет регекс, поскольку по умолчанию они работают в режиме, который раньше требовалось устанавливать модификатором /x. В Perl 6 такой модификатор более не нужен.

При попытке воспользоваться старым синтаксисом компилятор сообщит об этом на этапе компиляции:

===SORRY!=== Error while compiling /Users/ash/re-5.pl
Unsupported use of =~ to do pattern matching; in Perl 6 please use ~~
at /Users/ash/re-5.pl:3
------> say 'A' =~⏏ /a/i;

One thought on “17. Модификаторы в регексах Perl 6 vs. Perl 5”

  1. Модификатор s раньше включал переводы строк для точки,
    https://perldoc.perl.org/perlre.html#Modifiers

    $x = "There once was a girl\nWho programmed in Perl\n";
    $x =~ /girl.Who/s;  # matches, "." matches "\n"

    теперь включает пробел между регулярными выражениями.
    https://docs.perl6.org/language/regexes#Sigspace

    say so 'a a' ~~ / a a /; # False
    say so 'a a' ~~ m:s/ a a /; # True

    Модификатор m раньше означал «m modifier (//m): Treat string as a set of multiple lines. ‘.’ matches any character except «\n». ^ and $ are able to match at the start or end of any line within the string.»,

        $x = "There once was a girl\nWho programmed in Perl\n";
        $x =~ /^Who/m;  # matches, "Who" at start of second line

    теперь — «The :ignoremark or :m adverb instructs the regex engine to only compare base characters, and ignore additional marks such as combining accents:»
    https://docs.perl6.org/language/regexes#Ignoremark

    say so 'a' ~~ rx/ä/;                # OUTPUT: «False»
    say so 'a' ~~ rx:ignoremark /ä/;    # OUTPUT: «True»
    say so 'ỡ' ~~ rx:ignoremark /o/;    # OUTPUT: «True>

    Модификаторы теперь называют в документации не Modifiers, а Adverbs.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *