我理解Perl有很多不寻常的语法,但最近在工作中遇到了一段让我困惑的代码片段。请问是否有人能够向我解释一下它的含义:
<<'m'=~m>>
print $a unless $b;
return;
m
;
看起来像是HEREDOC语法,但不是我见过的任何形式。
我理解Perl有很多不寻常的语法,但最近在工作中遇到了一段让我困惑的代码片段。请问是否有人能够向我解释一下它的含义:
<<'m'=~m>>
print $a unless $b;
return;
m
;
看起来像是HEREDOC语法,但不是我见过的任何形式。
这个秘密的语法被称为华丽双刃剑,通常表示为:
<<m=~m>>
Comments here
m
;
=~
),使用>
作为分隔符。/
未被用作匹配分隔符,所以需要使用'm'运算符。例如,$my_var =~ /test/
相当于$my_var =~ m>test>
,而$my_var =~ >test>
将无效。m
字符被单引号括起来,这意味着$a
和$b
变量不会被插值。如果省略这些引号(如我的提供的代码示例),perl将自动在结束标记后添加双引号,并且任何后续变量都将被插值。如果$a
和$b
未再定义并且您正在使用use warnings;
,则会出现问题。<<"END" =~ //
Comments here
END
;
=~ //
是多余的,因此这等同于:<<"END";
Comments here
END
运行B::Deparse会有很大帮助,以便理解Perl如何处理那段代码(假设它在“test.pl”文件中):
perl -MO=Deparse test.pl
展示给我们:
"print \$a unless \$b;\nreturn;\n" =~ //;
test.pl syntax OK
所以,正如您所看到的,perl 正试图将一个空的正则表达式与这个字符串匹配:"print \$a unless \$b;\nreturn;\n"