Добрый вечер! Тема сегодняшнего поста — как правильно ставить модификаторы в регексах 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;
Модификатор s раньше включал переводы строк для точки,
https://perldoc.perl.org/perlre.html#Modifiers
теперь включает пробел между регулярными выражениями.
https://docs.perl6.org/language/regexes#Sigspace
Модификатор 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.»,
теперь — «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
Модификаторы теперь называют в документации не Modifiers, а Adverbs.