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

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

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 Ответ

0 голосов
/ 01 января 2019

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

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

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

...