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
有时我有一个很长的列表,我想检查一个字符串是否匹配列表中的任何内容.
使用列表,而不是结点:
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)
您之前已经问过相关问题.为方便起见,我会在这里添加几个链接: