Иногда у меня длинный список, и я хотел бы проверить, соответствует ли строка чему-либо в списке.
Использовать список, а не Junction:
my @list = <bar bartoo baragain>;
say 'bartoo' ~~ / @list /; # 「bartoo」
say 'bartoo' ~~ / <{<bar bartoo baragain>}> /; # 「bartoo」
Обратите внимание, что по умолчанию вы получаете самый длинный соответствующий токен.
Я пытаюсь интерполировать соединение внутри регулярного выражения.Все они ошибки.... Означает ли это сообщение об ошибке, что соединения не могут быть использованы внутри интерполяции регулярных выражений?
Я так думаю.(Возможно, сообщение об ошибке является LTA.) Соединения являются особенностью основного языка P6.Кажется разумным, что шаблон, соответствующий DSL , не поддерживает их.
Обходное решение, которое у меня есть,
say "12345" ~~ m/ <{ (2,3,4).join("||") }> /
「2」
Если высоединитесь с удвоенным каналом (||
), тогда вы получите первый токен, который соответствует, а не самый длинный:
say 'bartoo' ~~ / <{'bar || bartoo || baragain'}> /; # 「bar」
say 'bartoo' ~~ / ||@list /; # 「bar」
say 'bartoo' ~~ / ||<{<bar bartoo baragain>}> /; # 「bar」
Not , указание символа канала для этих конструкций такое же, какуказание одного символа канала (|
) и совпадение с самым длинным соответствующим токеном:
say 'bartoo' ~~ / <{'bar | bartoo | baragain'}> /; # 「bartoo」
say 'bartoo' ~~ / |@list /; # 「bartoo」
say 'bartoo' ~~ / |<{<bar bartoo baragain>}> /; # 「bartoo」
Вы уже задавали похожие вопросы раньше.Для удобства я добавлю здесь ссылки на несколько из них: