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

Ali*_*emp 82 perl

所以我理解perl有很多不同寻常的语法,但是我在工作中遇到了一段代码片段,这让我感到困惑.有人可以向我解释它的含义:

<<'m'=~m>>
print $a unless $b;
return;
m
;
Run Code Online (Sandbox Code Playgroud)

它看起来像HEREDOC语法,但不是我见过的任何形式.

Hay*_*den 124

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

<<m=~m>>

Comments here

m
;
Run Code Online (Sandbox Code Playgroud)

这是对多行注释的破解,它使用了heredoc语法并将operator(=~)与>as分隔符匹配.

注意,作为斜杠,/不用作匹配的分隔符,'m'运算符是必需的.例如$my_var =~ /test/相当于$my_var =~ m>test>,而$my_var =~ >test>无效.

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

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

<<"END" =~ //

Comments here

END
;
Run Code Online (Sandbox Code Playgroud)

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

<<"END";

Comments here

END
Run Code Online (Sandbox Code Playgroud)

这只是void上下文中的标准heredoc语法.

我不建议在生产代码中使用它,因为在void上下文中使用字符串会导致问题.此外,即使是最有经验的perl程序员,这段代码也是一个令人头疼的问题,并且毫无意义地难以阅读和维护!如果你想创建正确的多行注释,那么我建议坚持pod如此处所解释的如何在Perl中输入多行注释?

希望这清除它.


Mig*_*Prz 24

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

perl -MO=Deparse  test.pl 
Run Code Online (Sandbox Code Playgroud)

给我们看一看:

"print \$a unless \$b;\nreturn;\n" =~ //;
test.pl syntax OK
Run Code Online (Sandbox Code Playgroud)

因此,正如您所看到的,perl正在尝试将空的regexpr与此字符串匹配: "print \$a unless \$b;\nreturn;\n"