如何在Perl中仅注释掉一行的部分内容?

18

我如何在Perl中注释掉单行的一部分,例如以下行:

 if($clevel==0){#never happends}
我想在不换行的情况下评论最近的闭合括号。

请具体说明:复制并粘贴您正在使用的代码行,并告诉我们您想有选择地添加注释的部分。 - Greg Bacon
你的代码有什么问题吗?你是否在块结束后加了其他代码?如果你不打算运行这个块,为什么不把if语句注释掉呢? - brian d foy
1
当然,我问这个问题主要是想知道如何一般性地解决这个问题。这一个实例本身并不是什么大事。但原因是为了增加可读性。 如果我注释掉这行代码,它的颜色会改变,并且它也会与其他if($clevel==x)行不对齐。 - john-jones
6个回答

12

如果真的很重要,那就使用源过滤。

# C_Style_Comments.pm
package C_Style_Comments;
use Filter::Simple;
FILTER {   s{/\* .* \*/}{}gmx    };
1;

$ perl -MC_Style_Comments -e 'print /* 5, No wait, I mean */ 3'
3

+1 for源代码过滤器。以你的方式,看起来甚至可以注释掉评论或字符串的一部分。很棒! - Axeman
11
源过滤器很危险。突然间,你就不能相信眼前的代码了,因为程序中某个不可见的魔法可能会修改它。在开发中可能有用,但在生产代码中要远离它。依我之见。 - Ether
2
像许多邪恶的事物一样,源代码过滤器也有其使用的时间和场合(本问题不一定是这些时候之一)。始终戴上您的安全护目镜。 - mob
3
我已经为你将Acme::SafetyGoggles上传至CPAN了,;-) - mob
1
规则:嘿,这是一个很棒的模块!但使用Acme模块的人被认为知道他们正在做什么...我只是针对初学者提出了建议。 :) - Ether

11

#符号开头的注释在行尾结束。


2
是的,我知道,但我想在该行结束之前结束注释。 - john-jones
3
@Herrmann Ingjaldsson: 没有相应的条款...但是在这里查看Perl6的想法:http://dev.perl.org/perl6/rfc/102.html - lexu
哦,好的,问题解决了。 - john-jones

7

你为什么不能写:

if($clevel==0){#never happends}

作为:

if($clevel==0){} #never happens

有一些技巧可以用来隐藏信息,比如:

0 and 'some comment'

但如果将来有其他人需要维护您的代码,如果您不顾语言的限制,强行使其像其他熟悉的语言一样运作,只会让人更加困惑。
在语言的限制内工作,而不是试图迫使它像更熟悉的语言一样运作,通常会带领您学习新的知识。个人来说,我不喜欢在IDL中工作,但是处理较差的循环性能的一些技巧,使我优化了以后用其他语言编写的代码。

2
为了完整的代码维护,你不应该只是在“不可能的条件”上进行注释,而应该发出警告或死亡或打印一些有趣的消息(因为这样可以传达),以便你知道代码何时遇到了这些“不可能”的行。 - Axeman
@Axeman:在调试一些代码后,我更喜欢避免使用“die”,因为有些人没有考虑未来事物可能如何变化,从而触发了那些“这不应该发生”的部分。但你是对的——warn 'this should never happen'能够实现提出的具体情况。 - Joe
啊,这是我的一位教授曾经推荐的一种方法,用于在没有多行注释机制时“注释掉”代码部分。 - Honinbo Shusaku
@Abdul:多行注释很棘手,因为如果非常长的话,很难确定注释何时结束。或者如果您尝试注释包含另一个注释的块。但是您可以使用Perl中的'<<EOF'语法或POD来实现它。 - Joe
多年后,我离开了一份工作,然后收到了一封电子邮件,询问为什么我的代码会产生“这不应该发生”的消息。果然,有人更改了一些逻辑,以至于它进入了“永远不会发生”的块中。 - Joe

6

一个 # 然后是一个换行符。你可以把它们视为一种括号,因为在Perl中,从不同的行中得到的意义很少会失去。

my $ans = 2 + rand( 5 ) + $pixels / FUDGE_FACTOR;

To

my $ans = # 2 + 
    rand( 5 ) + $pixels # / FUDGE_FACTOR
    ;

或者来自:
if ( dont_know_how_this_breaks() && defined $attribute ) { 
   #...
}

收件人:

if ( # dont_know_how_this_breaks() && 
     defined $attribute ) { 
   #...
}

是的,没错,但我的意思是在同一行内先写点什么,然后加注释,再继续写。 - john-jones
@Hermann为什么像这个答案中那样拆分代码行不符合您的要求? - Greg Bacon
因为它要求我分割这行。 我希望句子在注释后面继续。 对于句子中的单个词的简短解释,不应该需要换行。 我正在编写的代码如下: if($clevel==0) {#永远不会发生} 在这里,如果我可以完成一个闭合括号而不换行,那就太好了。 这有点像不需要在引号中放入[]时换行一样。 需要换行符操作符可能会降低可读性和紧凑性。 最后,如何在此处强制换行注释? - john-jones
2
@Hermann Ingjaldsson:仅仅评论某些事情不会发生并不像执行断言那样有用。我曾经遇到过代码命中从未发生的行,报告它已经命中了您从未想到的条件是很有用的。 - Axeman

4

将字符串用作内联注释:

perl -lne '$a++; q#some explanation#;print;'

内联注释对于在Makefile(以及Bash脚本和Vim脚本)中嵌入的Perl代码进行注释是必要的,例如在这个vimscript中调用perl .. VIM同义词库文件


谢谢,这个回答值得被选为正确答案。 - FantomX1

-1

Perl中的单行或多行注释:

=comment
...
...
...

=cut

2
我见过这种多行注释的语法,但没有看到过针对部分行注释的。我不是100%确定,但我认为你声称这种语法可以用于部分行注释是错误的。 - oyvey

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