perl中的<< m'=〜m >>语法是什么意思?

所以我明白,perl有很多不寻常的语法,但是我偶然发现了一个工作中的代码片断,这让我感到困惑。 有人可以向我解释这是什么意思:

<<'m'=~m>> print $a unless $b; return; m ; 

它看起来像HEREDOC语法,但不是我见过的任何forms。

这个秘密语法被称为华丽的双刃剑 ,通常表示为:

 <<m=~m>> Comments here m ; 

这是一个多行注释的黑客攻击,利用heredoc语法和匹配运算符( =~ )作为分隔符。

请注意,斜线“ /不用作匹配的分隔符,“m”运算符是必需的。 例如$my_var =~ /test/相当于$my_var =~ m>test> ,而$my_var =~ >test>则无效。

请注意,代码片段中的第一个m字符用单引号括起来,这意味着$a$bvariables不会被内插。 如果省略了这些引用(按照我提供的代码示例),perl会自动将双引号添加到结束标记,并且将插入任何后续variables。 如果$a$b不再被定义,并且您正在使用use warnings;则会导致问题use warnings;

为了使上面华丽的双刀片例子更容易理解(但仍然不推荐),我们可以这样写:

 <<"END" =~ // Comments here END ; 

请注意=~ //是多余的,所以这相当于:

 <<"END"; Comments here END 

在void上下文中,这只是标准的heredoc语法。

我不build议在生产代码中使用这个,因为在void上下文中有一个string会导致问题。 再加上这个代码对于即使是最有经验的perl程序员来说也是个头疼的问题,而且毫无意义地难以阅读和维护! 如果你想创build适当的多行注释,那么我会build议坚持到pod这里解释如何在Perl中input多行注释?

希望这个清除它。

运行B :: Deparse有助于理解perl如何处理这段代码(假设它是在“test.pl”文件中):

 perl -MO=Deparse test.pl 

给我们看一看:

 "print \$a unless \$b;\nreturn;\n" =~ //; test.pl syntax OK 

所以,你可以看到,perl试图匹配一个空的regexpr到这个string: "print \$a unless \$b;\nreturn;\n"