【问题标题】:How to use junction inside a perl6 regex interpolation?如何在 perl6 正则表达式插值中使用联结?
【发布时间】:2019-01-01 00:12:59
【问题描述】:

有时我有一个很长的列表,我想检查一个字符串是否与列表中的任何内容匹配。我正在尝试在正则表达式中插入一个连接。都是错误。

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」

如何在正则表达式插值中使用联结?

【问题讨论】:

  • 如果您将so 放在交汇点前,似乎第一个案例可以编译:say "12345" ~~ m/ &lt;{ so (2,3,4).any }&gt; /(但我认为这不能解决问题)

标签: regex interpolation raku junction


【解决方案1】:

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

使用列表,而不是连接:

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」

您以前曾问过相关问题。为方便起见,我将在此处添加几个链接:

【讨论】:

    猜你喜欢
    • 2018-10-17
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    • 2018-09-10
    • 2014-07-01
    • 2011-05-24
    • 2023-04-01
    相关资源
    最近更新 更多