perl6 Как использовать соединение внутри регулярных выражений?

Иногда у меня длинный список, и я хотел бы проверить, соответствует ли строка чему-либо в списке. Я пытаюсь интерполировать соединение внутри регулярного выражения. Все они ошибки.

say "12345" ~~ m/ <{ (2,3,4).any }> /
Cannot resolve caller MAKE_REGEX(Int, Bool, Bool, Int, PseudoStash); none of these signatures match:

say "12345" ~~ m/ $( (2,3,4).any ) /
This type cannot unbox to a native string: P6opaque, Junction

Означает ли это сообщение об ошибке, что соединения не могут быть использованы внутри интерполяции регулярных выражений?

Обходной путь у меня есть

say "12345" ~~ m/ <{ (2,3,4).join("||") }> /
「2」

Любые предложения, как использовать соединения внутри регулярного выражения?

Большое спасибо!!!

lisprog

1 ответ

Решение

Иногда у меня длинный список, и я хотел бы проверить, соответствует ли строка чему-либо в списке.

Используйте список, а не 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」

Не указание символа канала для этих конструкций аналогично указанию одного символа канала (|) и соответствует самому длинному соответствующему токену:

say 'bartoo' ~~ / <{'bar | bartoo | baragain'}> /; # 「bartoo」
say 'bartoo' ~~ / |@list /;                        # 「bartoo」
say 'bartoo' ~~ / |<{<bar bartoo baragain>}> /;    # 「bartoo」

Вы задавали похожие вопросы раньше. Я добавлю ссылки на пару из них здесь для удобства:

Другие вопросы по тегам