以下之间到底有什么区别(如果有的话):
sub foobar() {
# doing some stuff
}
和
sub foobar {
# doing some stuff
}
我看到了其中的一些,第一个语法有时无法编译。
最佳答案
通过将 ()
放在子例程名称的末尾,您就为其提供了一个原型(prototype)。原型(prototype)为 Perl 提供有关将传递给子例程的参数的数量和类型的提示。请参阅this section in perlsub了解详情。
具体来说,()
是一个空原型(prototype),它告诉 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 的原型(prototype)实现通常并不像人们通常认为的那样有用,并且除了少数特殊情况之外,大多数 Perl 专家都会避免使用它们。我建议您也这样做。从 Perl v5.22 开始,实验性的“签名”功能正在测试中,有望实现其他语言的程序员期望从原型(prototype)中实现的许多目标。
关于perl - 带括号和不带括号的 Perl 子声明有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31376390/