В регексах Perl 6 есть два вида альтернатив — варианты разделяются либо одной, либо двумя вертикальными чертами.
Одинарная вертикальная черта создает список альтернатив, из которых выигрывает наиболее длинная. Рассмотрим такой пример:
say 'abcd' ~~ / a | ab | abc /;
Программа печатает 「abc」, то есть совпала самая длинная строка, несмотря на то, что она была последней в списке.
Теперь в той же программе удвоим все вертикальные черты:
say 'abcd' ~~ / a || ab || abc /;
На печати окажется 「a」, то есть первый же совпавший вариант.
В Perl 6 к регексам или их частям можно добавить блок кода, который выполнится, если эта часть совпала. Модифицируем предыдущие примеры:
'abcd' ~~ / | a { say 'a' } | ab { say 'ab' } | abc { say 'abc' } /; 'abcd' ~~ / || a { say 'a' } || ab { say 'ab' } || abc { say 'abc' } /;
Обратите внимание, что для красоты разрешается ставить еще одну (одинарную или двойную) вертикальную черту перед первой альтернативой. В этом случае пустота перед первой чертой как отдельный вариант не добавится.
Программа печатает две строки:
abc a
То есть был выполнен только тот блок кода, который соответствует выбранной альтернативе. Во втором примере это очевидно, а в первом — хотя последовательно совпадают и a, и ab, выполняется только третий блок кода.