【问题标题】:What is the reason to use parenthesis-less subroutine calls in Perl? [closed]在 Perl 中使用无括号子例程调用的原因是什么? [关闭]
【发布时间】:2013-04-02 19:44:22
【问题描述】:

根据perldoc perlsub

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

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

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

一样有效
open(my $fin, '<', $file);

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

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

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


附:我完全知道喜欢带括号的版本的原因 - 例如the issues with indirect object notation,或requirement to declare non-builtins before they are used without parenthesis,或优先visavi or|| 的问题。我感兴趣的是相反的。


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

【问题讨论】:

  • 我不使用括号来区分内置插件。这是我遵循的唯一规则。
  • @ugexe - 有区分内置插件的主要原因吗?还是只是习惯?
  • 康威的建议似乎提供了完全是装饰/风格的原因。由于CodeLayout::ProhibitParensWithBuiltinsPerl::Critic 的内置规则之一,许多编码人员可能会发现遵守比编辑他们的.perlcriticrc 更容易。选择最适合您的选项....
  • 我想这是因为perl想要支持不同的编码风格。曾经编程的人是 shell,使用printf "%d\n" $arg1; 的形式很常见。对于 C 编码器,更可取的是 printf("%d\n", arg1); 样式。在perl 中两者都可以使用。

标签: perl coding-style call subroutine parentheses


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    Conway 是Perl Best Practices 一书的作者。

    【讨论】:

    • 请注意,只有在您从不调用没有括号的用户函数时才会消除歧义。
    • 这并没有解释(1)为什么区分内置函数和用户函数是有益的;并且(2)似乎表明除了这种消歧之外没有其他好处......
    • 除非您按照 Joel Berger 的解释将 & 与子例程名称一起使用,否则没有其他好处。我个人更喜欢使用括号,因为它可以帮助我在视觉上将参数与行上的其他任何内容区分开来,例如open(my $FILE, "&lt;", $filename) or die("Can not open $filename: $!");
    • @imran 你也写print("Hi!\n");吗?
    • @darch 我猜 print 是个例外。我不会对短字符串使用括号,如果我指定文件句柄也不会。如果它有多个参数或类似加入的东西,我可能会。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      请注意,将 Perl 写成 C 语言是明显的糟糕 风格。像 Perl 一样编写 Perl。

      【讨论】:

      • 我知道“坏风格”是一种时髦的说法,但为什么呢?
      • @dvk 这个问题是什么意思? “为什么“坏作风”被认为是一个问题?'? '为什么写 Perl 就好像它是 C 不好的风格?'? '为什么编写可读的代码是好的风格?'?换句话说,您的问题是否与上述答案有关——如果有,那是什么——还是仅仅是拖钓?
      • #2。 “为什么写 Perl 就好像它是 C 不好的风格?”。除了“因为每个编写 Perl 的人都主观地喜欢它”之外,还有什么东西让括号中的 subs 调用“不好”?
      • 而且“它更具可读性”不是一个经过验证的断言,没有实际的可用性测试,例如进行双盲测试,人们尝试阅读两种样式的代码。
      • @DVK 哦,亲爱的,坚持可证明的断言是一个重要迹象,表明您的问题是恶意提出的。考虑到这一点,我已经完成了。我已经对你的问题给出了真实的答案;如果您不想知道,我无法进一步帮助您。
      猜你喜欢
      • 2015-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-23
      • 1970-01-01
      相关资源
      最近更新 更多