我有一个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中导致此错误的原因是什么?
答案 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;只有在逃脱时才会字面匹配
(如果没有转义,它们要么具有特殊含义,例如.
,+
,#
等,要么被禁止。)
1 &#39; Lone&#39;意思不是较大标记的一部分,例如带引号的字符串或embedded comment的开启者。
答案 1 :(得分:3)
散列#
用作Perl 6正则表达式中的注释标记。
添加反斜杠\
以逃避它
if ( $line =~ /^\s*\#/ )