Захватывающие скобки
Регексы Perl 6, как и регулярные выражения в Perl 5, захватывают совпавшие подстроки, заключенные в круглые скобки. Например:
'Hello, World!' ~~ / ( . ) ',' /; say $0;
Регекс захватил символ, расположенный перед запятой:
「o」
На что следует обратить внимание. Во-первых, переменные нумеруются, начиная с нуля, а не с единицы: $0. Во-вторых, в такой переменной находится объект типа Match, а не просто строка:
say $0.WHAT; # (Match)
Преобразование в строку можно выполнить с помощью префиксного унарного оператора ~:
say (~$0).WHAT; # (Str)
Именованный захват
Переменные типа $0 удобны, если захватывающих скобок мало, или, например, если в регексе нет альтернатив, и вычислить номер просто. В более сложных задачах удобнее давать захваченным фрагментам имена. В следующем примере показано, как это делать:
for 'Hello, World!', 'Hi, John!' -> $str { $str ~~ / $<greeting>=(Hello | Hi) ', ' $<name>=(\w+) /; say $<greeting>; say $<name>; }
Здесь приветствие сохраняется в переменной $<greeting>, а имя — в $<name>. Такая запись — сокращенная форма полного обращения к полям переменной типа Match: $/<greeting> или $/<name>.
Незахватывающие скобки
Круглые скобки одновременно и захватывают, и группируют. Если нужна только группировка, но не захват, поставьте квадратные скобки:
say 'Hello, World!' ~~ / [Hello | Hi] /; # 「Hello」 say 'Hi, World!' ~~ / [Hello | Hi] /; # 「Hi」