Perl中常用的多行注释解决方案有哪些?

35

这份 RFC 提到:

与许多编程语言不同,Perl 目前没有实现真正的多行注释。这一点与通常使用的解决方法可能会有问题。可以通过添加新的语法来允许注释跨越多行,类似于下面提到的 here-documentation 变体来解决这个问题。

那么什么是常用的解决方法呢?

我在这里发现了两种技巧:

if (0) {
  <comment>
}

并且

=pod
<comment>
=cut

这些是否安全使用?还有其他更好的替代品吗?


6
为什么在每行开头放置#被认为是繁琐的呢?许多编辑器都可以使用宏(或等效物)轻松地完成这项工作... - Donal Fellows
不要过分依赖 Perl 6 RFCs。Larry 拒绝了其中的大部分。 - brian d foy
13个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
37
“if”解决方案的缺点是,被注释的代码仍然需要编译(因此仍然需要进行语法检查)。 您的pod解决方案的缺点是,您的注释将出现在从pod生成的任何文档中。 我使用的pod解决方案版本没有这个问题。Pod支持由特定格式化程序处理的=begin format ... =end format段落。我只需发明一个未被我使用的任何格式化程序处理的“comment”格式即可。
#!/usr/bin/perl

print "This line is executed\n";

=begin comment

print "This line isn't\n";

=end comment

=cut

print "This line is\n";

10
需要保留第一版(不令人满意的版本)在答案中吗?我认为它对解决方案没有任何帮助。你可以编辑你的答案并删除它,这样人们就可以立即看到正确的解决方案了。谢谢! - user2443147

18
Perl文档告诉您如何在perlfaq7中执行此操作。这很安全,由于我们可以使用Pod来完成它,因此我们不需要额外的语法来执行它:
如何注释掉大块的 Perl 代码? 您可以使用内嵌的 POD 进行注释。将要注释的代码块放置在 POD 标记中。 =begin 指令标识了特定格式化程序的部分。使用“comment”格式,该格式不应被任何格式化程序理解(按照策略)。使用=end标记代码块结束。
   # program is here

   =begin comment

   all of this stuff

   here will be ignored
   by everyone

   =end comment

   =cut

   # program continues

Pod指令不能随意放置。您必须在解析器期望新语句的位置放置一个pod指令,而不仅仅是在表达式中间或其他任意语法产生式中。

有关更多详细信息,请参见perlpod


11

虽然这不是标准写法,但我就是使用

=ignore 

sub blah { ... }
my $commented_out_var = 3.14;

=cut

它同样有效,并提醒我它并不是POD。

  • 顺带一提:有趣的是,POD为我们提供了一个灵活的框架,用于包括各种不应被视为代码的区域,指定该区域的含义。显然,“注释掉”东西是因为注释可以这样工作。然而,从术语上看,注释应该是单词,而不是指令;是文档说明而不是更改。

7

一款带有“注释区域”功能的编辑器。

例如,Komodo Edit。我相信Eclipse和JEdit也有这个功能,但我手头没有它们来检查。

该功能通常会在所选区域的每一行开头插入一个“注释此行”的符号。它的好处是不会与现有的注释冲突(如果您在大多数语言中包含一个多行注释的区域,则存在风险)。


例如?我使用的是 vim,它仅支持C/C++/Java注释 - Lazer
1
Vim与perl-support插件使用=pod/=cut方法。 http://www.vim.org/scripts/script.php?script_id=556 - Tore A.
2
请升级到Vim 7.3(http://perlbuzz.com/2010/08/vim-73-supports-perl-6.html),或者访问https://github.com/petdance/vim-perl。 - daxim
@Lazer:在vim中一次编辑多行非常容易,而在gvim中更加简单。只需进入可视化高亮模式,选择一个范围,插入文本,然后<bam>。 - Ether

4

我最喜欢的多行注释工具是__END__

print "Hello world\n";

__END__

The script has ended. Perl does not treat this part of the file as code.

I can put whatever I want down here. Very handy.

@FM:你如何在Perl中使用它? - Lazer
3
@Lazer: __END__perldoc perlmod 中有详细说明,你或许需要花更多时间在 perldoc 网站上熟悉它的文档(也可以阅读一本《学习 Perl》的书籍)。 - Ether

4

这也可以:

q^
   This is another way to 
   add multi-line comments
   to your code
^ if 0;

3
除了

这个之外

=begin comment

multi-paragraph comments here

=end comment

=cut

除了其他答案中的表单,您还可以这样做:

=for comment
this is a single pod paragraph comment do
not put extra blank lines after =for.  the
comment ends after the first blank line and
regular pod continues until =cut

Hello! C<Yay!>

=cut

注释段落不会出现在Pod输出中,但是“Yay!”的问候语将会出现。


1
这个更简单的结构对我很有用。
=comment

It was hard in the Moonta Mines that year
For the miners, down in the pit,
It wasn’t a place for a weak man, but
The Cornish Miners had grit,
They burrowed deeper with every day
Extracting the copper ore,
And the skimps grew high in the heaps that piled
Not far from the Moonta shore.

=cut

1

类似这样的东西也可以:

q{
my comment
};

我猜这是在运行Perl时评估的表达式。


我喜欢这种简单的方法,但是我收到了以下警告:在void上下文中使用无用的常量 - EverythingRightPlace
你害怕警告吗? - Aftershock

1
一个特殊的用例是注释掉几行代码。但如果您使用版本控制系统,您可以直接删除不需要的代码而不是将其注释掉,如果您需要它回来,只需获取旧版本即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,