我有一个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中导致此错误的原因是什么?
散列#
用作Perl 6正则表达式中的注释标记。
添加一个反斜杠\
来逃避这样
if ( $line =~ /^\s*\#/ )
在Perl 6中,从lone1 #
到行尾的所有内容都被视为注释,即使在正则表达式中也是如此。
要避免这种情况,请将其放在引号内,使其成为字符串文字:
if $line ~~ / ^ \s* '#' / { say "matches"; }
(使用\
逃脱也应该有效,但Rakudo seems to have a parsing bug使得在前面有空格时不起作用。并且引用此处所示的字符无论如何都是推荐的方式 - Perl 6专门在正则表达式中引入引用的字符串并且默认情况下使空格无关紧要,为了避免许多Perl 5 regex受到的反斜杠混乱。)
更一般地说,所有非字母数字字符都需要在Perl 6正则表达式中引用或转义,以便按字面意思匹配它们。 这是Perl 5中另一个故意的非向后兼容的变化,这有点复杂。在Perl 6中有一个简单的规则:
\s
等,要么被禁止。).
,+
,#
等,要么被禁止。)1'孤独'意味着不是更大的标记的一部分,例如引用的字符串或embedded comment的开启者。