В регексах 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, выполняется только третий блок кода.