perl6如何在正则表达式插值中使用连接?

lis*_*tor 7 regex interpolation perl6 junction

有时我有一个很长的列表,我想检查一个字符串是否匹配列表中的任何内容.我试图在正则表达式内插入一个结点.他们都是错误.

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
Run Code Online (Sandbox Code Playgroud)

此错误消息是否表示无法在正则表达式插值中使用联结?

我的解决方法是

say "12345" ~~ m/ <{ (2,3,4).join("||") }> /
?2?
Run Code Online (Sandbox Code Playgroud)

有关在正则表达式插值中使用连接的任何建议吗?

非常感谢你 !!!

lisprog

rai*_*iph 8

有时我有一个很长的列表,我想检查一个字符串是否匹配列表中的任何内容.

使用列表,而不是结点:

my @list = <bar bartoo baragain>;
say 'bartoo' ~~ / @list /;                         # ?bartoo?
say 'bartoo' ~~ / <{<bar bartoo baragain>}> /;     # ?bartoo?
Run Code Online (Sandbox Code Playgroud)

请注意,默认情况下,您将获得最长的匹配令牌.

我试图在正则表达式内插入一个结点.他们都是错误....此错误消息是否表示在正则表达式插值中不能使用联结?

我认同.(错误消息可能是LTA.)连接是主要P6语言的一个特性.模式匹配DSL不支持它们似乎是合理的.

我的解决方法是

say "12345" ~~ m/ <{ (2,3,4).join("||") }> /
?2?
Run Code Online (Sandbox Code Playgroud)

如果您使用doubled pipe(||)加入,那么您将获得匹配而不是最长的第一个令牌:

say 'bartoo' ~~ / <{'bar || bartoo || baragain'}> /; # ?bar?
say 'bartoo' ~~ / ||@list /;                         # ?bar?
say 'bartoo' ~~ / ||<{<bar bartoo baragain>}> /;     # ?bar?
Run Code Online (Sandbox Code Playgroud)

指定这些构造的管道符号与指定单个管道符号(|)并匹配最长匹配的令牌相同:

say 'bartoo' ~~ / <{'bar | bartoo | baragain'}> /; # ?bartoo?
say 'bartoo' ~~ / |@list /;                        # ?bartoo?
say 'bartoo' ~~ / |<{<bar bartoo baragain>}> /;    # ?bartoo?
Run Code Online (Sandbox Code Playgroud)

您之前已经问过相关问题.为方便起见,我会在这里添加几个链接: