17

根据perldoc perlsub

& 在现代 Perl 中是可选的,如果子例程已预先声明,则括号也是可选的。

我注意到很多时候,人们在调用 Perl 子例程时使用可以省略括号的事实(例如,从最近的 SO 答案中随机引用):

open my $fin, '<', $file;

open(my $fin, '<', $file);

使用第二个(无括号)版本的主要(理想情况下,技术)原因是什么?

perldoc perlsyn除了再次提及可选性外,没有就该主题发表任何意见。

对我来说,总是使用括号主要是一种风格选择,因为我是一名 C 开发人员。但我想知道作为 Perl 开发人员,我是否因为不使用可选的无括号语法而遗漏了什么。


PS我很清楚喜欢带括号的版本的原因-例如,间接对象表示法的问题,或者在使用不带括号之前声明非内置函数的要求,或者优先级visavi orvs.的问题||。我感兴趣的是相反的。


PPS 我对仅仅陈述“它的风格更好”/“更具可读性”而没有任何研究支持这一观点的答案不太感兴趣。我对喜欢省略括号的技术原因或支持的风格差异偏好感兴趣(请不要将“支持”与“呼吁权威”或“argumentum ad populum”的谬误混淆。一项研究显示速度或对代码的理解就是证明。“Perl 社区中的每个人都同意”或“Damien Conway 建议这一点”而不解释 Damien 如何支持这一点不是)。

4

4 回答 4

16

我认为除了风格之外,它真正重要的唯一时间是&subname根据perldoc perlsub很少使用的:

&NAME;     # Makes current @_ visible to called subroutine.

当然,在某些情况下使用括号可能更容易消除歧义(对于解析器和未来的读者),否则不使用它们可能会消除其他情况下的噪音;其中任何一个的必要程度可能是我选择其中一个的主要原因。

于 2013-04-02T20:58:45.763 回答
10

来自Perl::Critic::Policy::CodeLayout::ProhibitParensWithBuiltins

Conway 建议在参数列表周围不带括号调用所有内置函数。这减少了视觉混乱并消除了内置功能与用户功能的歧义。

Conway 是Perl Best Practices一书的作者。

于 2013-04-02T19:59:06.850 回答
7

省略括号没有技术原因。这纯粹是首选编码风格的问题。

于 2013-04-02T21:22:24.800 回答
3

这纯粹是一个风格问题。对于 Perl 程序员来说,print "Hi!\n";它比print("Hi!\n");. 使代码尽可能可读是一种很好的风格,而且——在其他条件相同的情况下——额外的符号会使阅读变得更加困难。由于内置插件不需要括号,因此询问它们提供的消歧是否证明了额外的认知负荷是有意义的。Perl 程序员作为一个阶级已经站在“不”一边,这在一定程度上得益于 Damien Conway 对规则的形式化。

Conway 还建议保持内置的无括号有助于将它们与用户定义的函数区分开来,但我认为这个论点没有说服力。更正确的说法是,许多内置函数被设计为无需括号即可自然阅读,因此应该这样使用。看到defined($x)len($y)使 Perl 程序员抽搐,但仅是看到croak($z).

请注意,将 Perl 当作 C 来编写是非常糟糕的风格。像 Perl 一样编写 Perl。

于 2013-04-03T16:31:48.603 回答