所以我理解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"