我有一个Perl 6代码,我正在执行以下操作:
if ($line ~~ /^\s*#/) { print "matches\n"; }
Run Code Online (Sandbox Code Playgroud)
我收到这个错误:
===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
Run Code Online (Sandbox Code Playgroud)
这是Perl 5代码的一部分:
if ($line =~ /^\s*#/)
Run Code Online (Sandbox Code Playgroud)
它曾经很好地识别具有可选空间和a的行#.
在Perl 6中导致此错误的原因是什么?
在Perl 6中,即使在正则表达式内,从单独1 #到行尾的所有内容都被视为注释.
要避免这种情况,请将其放在引号内,使其成为字符串文字:
if $line ~~ / ^ \s* '#' / { say "matches"; }
Run Code Online (Sandbox Code Playgroud)
(逃避\也应该工作,但Rakudo似乎有一个解析错误,这使得在前面有空格时不起作用.并且引用此处所示的字符无论如何是推荐的方式 - Perl 6专门在正则表达式中引入引用的字符串并创建空格默认情况下是微不足道的,以避免许多Perl 5正则表达式遭受的反斜杠混乱.)
更一般地说,所有非字母数字字符都需要在Perl 6正则表达式中引用或转义,以便按字面意思匹配它们.
这是Perl 5中另一个故意的非向后兼容的变化,这有点复杂.在Perl 6中有一个简单的规则:
字母数字 - >仅在未转义时才按字面匹配.
(当逃脱时,它们要么具有特殊含义,例如\s等等,要么被禁止.)
非字母数字 - >仅在转义时才按字面匹配.
(如果没有逃过,他们要么有特殊的含义,例如.,+,#等,或者是被禁止的.)
1 "龙"意思不是一个较大的令牌的一部分,例如一个引用字符串或一个的开启器嵌入的评论.
哈希#在 Perl 6 正则表达式中用作注释标记。
添加一个反斜杠\来转义它,如下所示
if ( $line =~ /^\s*\#/ )
Run Code Online (Sandbox Code Playgroud)