Perl 6 正则表达式未终止

Perl 6 regex not terminated

我有一个 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*#/)

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

在 Perl 6 中导致此错误的原因是什么?

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

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

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

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

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

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

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

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

  • 字母数字 --> 仅在 转义时按字面匹配。
    (转义时要么有特殊含义,如\s等,要么被禁止。)

  • 非字母数字 --> 仅在转义时按字面匹配。
    (不转义时,要么有特殊含义,如.+#等,要么是禁止的。)


1 'Lone' 表示不属于更大标记的一部分,例如带引号的字符串或 embedded comment 的开场符。