Perl 6正则表达式没有终止

时间:2017-12-29 13:45:15

标签: regex perl6

我有一个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中导致此错误的原因是什么?

2 个答案:

答案 0 :(得分:8)

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

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

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

(使用\进行转义也应该有效,但Rakudo seems to have a parsing bug会使前面有空格时不起作用。 并且引用这里显示的字符无论如何都是推荐的方式 - Perl 6在regex中特别引入了引用的字符串,并且默认情况下使空格无关紧要,以避免许多Perl 5正则表达式遭受的反斜杠混乱。)

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

  • 字母数字 - &gt;仅在转义时才按字面匹配 (转义时,它们要么具有特殊含义,例如\s等,要么被禁止。)

  • 非字母数字 - &gt;只有在逃脱时才会字面匹配 (如果没有转义,它们要么具有特殊含义,例如.+#等,要么被禁止。)

    < / LI>

1 &#39; Lone&#39;意思不是较大标记的一部分,例如带引号的字符串或embedded comment的开启者。

答案 1 :(得分:3)

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

添加反斜杠\以逃避它

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