【问题标题】:Perl 6 regex not terminatedPerl 6 正则表达式未终止
【发布时间】:2017-12-29 13:45:14
【问题描述】:

我有一个 Perl 6 代码,我正在执行以下操作:

if ($line ~~ /^\s*#/) { print "matches\n"; }

我收到此错误:

===SORRY!===
Regex not terminated.
at line 2
------> <BOL>�<EOL>
Unable to parse regex; couldn't find final '/'
at line 2
------> <BOL>�<EOL>
    expecting any of:
        infix stopper

这是 Perl 5 代码的一部分:

if ($line =~ /^\s*#/)

过去它可以很好地识别具有可选空格和# 的行。

是什么导致 Perl 6 中出现此错误?

【问题讨论】:

    标签: regex raku


    【解决方案1】:

    在 Perl 6 中,从单个1# 到行尾的所有内容都被视为注释,即使在正则表达式中也是如此。

    为避免这种情况,请将其放在引号内,使其成为字符串文字:

    if $line ~~ / ^ \s* '#' / { say "matches"; }
    

    (使用\ 转义也应该有效,但Rakudo seems to have a parsing bug 在前面有空格时会导致无效。 无论如何,引用此处显示的字符是推荐的方式——Perl 6 专门在正则表达式中引入了带引号的字符串,并且默认情况下使空格无关紧要,以避免许多 Perl 5 正则表达式遭受的反斜杠混乱。)

    更一般地说,所有非字母数字字符需要在 Perl 6 正则表达式中被引用或转义,以便按字面意思匹配它们。
    这是 Perl 5 的另一个有意的非向后兼容更改,其中有点复杂。 在 Perl 6 中有一个简单的规则:

    • alphanumeric --> 仅在 not 转义时匹配字面意思。
      (转义时,它们要么具有特殊含义,例如 \s 等,要么被禁止.)

    • 非字母数字 --> 仅在转义时匹配字面意思。
      (当未转义时,它们要么具有特殊含义,例如.+# 等。 ,或被禁止。)


    1“单独”表示不属于较大标记的一部分,例如带引号的字符串或embedded comment 的开头。

    【讨论】:

    • 正则表达式中的哈希仅表示注释,直到下一个换行符或模式结束,以先到者为准。
    • “你几乎必须记住整个列表”。不,如果您愿意,您可以非常安全地转义每个非单词字符。毕竟quotemeta 就是这样做的。
    • @Borodin “正则表达式中的散列仅表示注释,直到下一个换行符或模式结束,以先到者为准。”你说的是P5吗?我很确定在 P6 中“孤独的#”就像 smls 所说的那样工作。 (我已经在 smls 的回答中添加了一个脚注以覆盖 an embedded comment,但这是一个小细节——smls 可能会决定恢复我的编辑,所以我在此评论中也留下了解释该小细节的链接。)跨度>
    • @Borodin “如果你愿意,你可以非常安全地转义每个非单词字符。”但是你必须决定去做。 P5 中的 Imo the specific rules 很复杂,您必须了解它们才能知道是否需要申请 quotemeta,或者每次不确定时只需申请 quotemeta
    • @Borodin:很公平。我已经更新了答案以削弱关于 Perl 5 的说法。
    【解决方案2】:

    哈希 # 在 Perl 6 正则表达式中用作注释标记。

    添加一个反斜杠 \ 像这样转义它

    if ( $line =~ /^\s*\#/ )
    

    【讨论】:

      猜你喜欢
      • 2011-11-26
      • 1970-01-01
      • 2015-03-27
      • 1970-01-01
      • 2021-04-22
      • 1970-01-01
      • 2018-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多