了解奇怪的Perl多行注释机制

Joe*_*ger 13 perl comments operators

编辑:注意新的Perl程序员:这个机制不应该用于多行注释!它有一个缺陷降低可读性.

PerlMonks关于在Perl中生成多行注释的机制的帖子中,Abigail提供了这个,让我困惑:

使用here文档的问题是它会在'-w'下发出警告.使用鲜为人知的<< >>运算符要好得多.

<<q=~q>>;
  This is a multiline comment.
q
Run Code Online (Sandbox Code Playgroud)

运行它-M0=Deparse给出:

"  This is a multiline comment.\n" =~ //;
-e syntax OK
Run Code Online (Sandbox Code Playgroud)

有人能告诉我发生了什么事吗?

Gil*_*il' 15

阿比盖尔的回答部分是幽默的.实际上没有<< >>运算符(在5.22之前没有Perl的版本),但是有一个(不是那个众所周知的,我猜)<<运算符.不是二元移位运算符,而是一元文档(简称heredoc).一个简单的形式是:

$long_string = <<EOF;
This is a long, multiline string.
It ends when EOF appears alone on a line.
It will be assigned to the \$long_string variable.
EOF
Run Code Online (Sandbox Code Playgroud)

事实上,这是阿比盖尔答案背后的"多线评论"特征 - 多线字符串文字.其余的有点混淆了Perl.

<<字符串文字结束后的裸字或带引号的字符串.你可以q用作一个赤字:

<<q;
This is a multiline comment, or rather a string literal whose value is ignored.
q
Run Code Online (Sandbox Code Playgroud)

要理解Abigail的其余片段,将here-document重写为一个简单的字符串文字是有帮助的:

"This is a multiline comment.\n" =~ q>>;
Run Code Online (Sandbox Code Playgroud)

好的,现在q>>q类似引号的运算符,带有>分隔符.q>>相当于''(非插值的文字,恰好是空的).所以字符串文字与空模式匹配.该匹配的结果无论如何忽略,但这则会覆盖匹配结果变量($1,$&,等).

  • 我应该说`q`运算符不是正则表达式引用运算符(`qr`),而是非插值引号运算符 (2认同)

Ano*_*mie 11

哈.没有"<< >>"运算符这样的东西.那里发生的事情基本上等同于:

"" =~ ''
Run Code Online (Sandbox Code Playgroud)

=~当然,这是你通常使用的普通模式绑定操作符m//s///.的''是使用Q {}语法对于字符串,与>作为分隔符,并且被解释为在运行时间的模式.这""是一个here-doc q作为终止字符串.

我当然不会称之为评论.考虑这个程序片段的输出:

"copacetic" =~ q/(c[a-z]+)/;
print "$1\n";

<<q=~q>>;
    This is crap, not a comment!
q

print "$1\n";
Run Code Online (Sandbox Code Playgroud)


ike*_*ami 5

以下不是很漂亮,但它没有可执行代码.

0 && <<COMMENT
...
COMMENT
Run Code Online (Sandbox Code Playgroud)

  • =⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠pod (2认同)
  • 在tchrist的脉络中,甚至更好的似乎是pod格式作为注释命令`= for comment`,它被`perl`和`perldoc`(以及其他`pod`阅读器)忽略.然而,这不是我的问题. (2认同)