在Perl中使用无括号子程序调用的原因是什么?

DVK*_*DVK 15 perl coding-style call parentheses subroutine

根据perldoc perlsub:

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

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

open my $fin, '<', $file;
Run Code Online (Sandbox Code Playgroud)

同样有效

open(my $fin, '<', $file);
Run Code Online (Sandbox Code Playgroud)

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

除了再次提及选择性之外,perldoc perlsyn没有就该主题发表任何言论.

对我来说,由于我作为C开发人员的起源,总是使用括号主要是一种风格选择; 但我想知道我是否遗漏了不使用可选的无括号语法作为Perl开发人员的问题.


PS我完全清楚偏好带括号的版本的原因 - 例如间接对象​​表示法的问题,或者在没有括号的情况下使用非内置函数的要求,或者优先使用visavi orvs的问题||.我对相反的兴趣.


PPS我对答案并不是很感兴趣,只是在没有任何研究支持意见的情况下说明"它的风格更好"/"更具可读性".我对技术原因感兴趣,不喜欢括号遗漏,或支持风格差异偏好(请不要混淆"备份"与"诉诸权威"或"论证广告"谬误.研究显示速度提高或对代码的理解就是证据."Perl社区中的每个人都同意"或"Damien Conway建议这一点"而不解释Damien如何支持这一点并不是这样.

Joe*_*ger 15

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

&NAME;     # Makes current @_ visible to called subroutine.
Run Code Online (Sandbox Code Playgroud)

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


too*_*lic 9

Perl :: Critic :: Policy :: CodeLayout :: ProhibitParensWithBuiltins:

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

Conway是Perl Best Practices一书的作者.

  • 这并不能解释(1)为什么区分内置函数和用户函数是有益的; (2)似乎表明除了消除歧义之外没有任何附带利益...... (4认同)
  • 请注意,只有在没有parens的情况下才调用用户函数时,它才会消除歧义. (2认同)

Dav*_*man 7

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