【问题标题】:What's the difference between a Perl sub declaration with and without parentheses?带括号和不带括号的 Perl 子声明有什么区别?
【发布时间】:2015-07-13 22:12:12
【问题描述】:

两者之间究竟有什么区别(如果有的话):

sub foobar() {
    # doing some stuff
}

sub foobar {
    # doing some stuff
}

我看到了其中的一些,第一个语法有时无法编译。

【问题讨论】:

标签: perl


【解决方案1】:

通过将() 放在子例程名称的末尾,您就是在给它一个原型。原型向 Perl 提供有关您将传递给子例程的参数的数量和类型的提示。详情请见this section in perlsub

具体来说,() 是一个空原型,它告诉 Perl 这个子例程没有参数,如果你用参数调用这个子例程,Perl 会抛出一个编译错误。这是一个例子:

#!/usr/bin/perl

use strict;
use warnings;
use 5.010;

sub foo {
  say 'In foo';
}

sub bar() {
  say 'In bar';
}

foo();
bar();
foo(1);
bar(1);

由此产生的输出是:

Too many arguments for main::bar at ./foobar line 18, near "1)"
Execution of ./foobar aborted due to compilation errors.

最后一次调用 bar()(参数为 1 的那个)导致了这个错误。

值得注意的是,Perl 的原型实现通常没有人们通常认为的那么有用,而且除了一些特殊情况之外,大多数 Perl 专家都会避开它们。我建议你也这样做。从 Perl v5.22 开始,实验性“签名”功能正在测试中,有望实现其他语言的程序员对原型的期望。

【讨论】:

  • 如果您阅读某人的脚本,“关于参数的数量和类型的提示”是一个有价值的信息。将这些提示放在代码中不值得吗?你能说出为什么大多数人都避免它吗?
  • Tom Christiansen wrote it 比我做得好很多。
  • @Matthias If T.C.'s P.M. post 是 TL;DR,您可以考虑 perl 的数组和哈希类型所涉及的歧义; foo($a, $b) 也可能是 foo(@args) 等等。在那之后,世界分成了两个阵营,一个是会惊恐地逃跑并尽可能远离语言的人,另一个是把它视为中风的人天才或运气。请记住,它也是一种具有完善的文档样式 (POD) 的语言,对于 动态类型 语言,这可能被视为适当的职责分离。跨度>
猜你喜欢
  • 1970-01-01
  • 2020-04-17
  • 1970-01-01
  • 1970-01-01
  • 2021-06-29
  • 1970-01-01
  • 1970-01-01
  • 2015-05-08
相关资源
最近更新 更多