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」
Вы задавали похожие вопросы раньше. Я добавлю ссылки на пару из них здесь для удобства: