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


82

因此,我知道perl的语法很不正常,但是前一天在工作中遇到了一个代码片段,这让我感到困惑。有人可以向我解释这是什么意思:

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

它看起来像HEREDOC语法,但没有任何我见过的形式。



1
您可以在此处访问Perl秘密运算符和常量的列表。
aloisdg移至codidact.com,2015年

Answers:


124

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

<<m=~m>>

Comments here

m
;

这是一种用于多行注释的技巧,它使用Heredoc语法并将match运算符(=~)与>用作分隔符。

请注意,由于斜杠/不能用作匹配的定界符,因此需要'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

这只是无效上下文中的标准Heredoc语法。

我不建议在生产代码中使用它,因为在无效上下文中包含字符串可能会引起问题。加上此代码,即使是最有经验的perl程序员,也是头疼的问题,毫无意义地难以阅读和维护!如果要创建适当的多行注释,那么我建议按照此处的说明使用pod,如何在Perl中输入多行注释?

希望这可以解决。


24

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

perl -MO=Deparse  test.pl 

给我们看一看:

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.