perl - 带括号和不带括号的 Perl 子声明有什么区别?

标签 perl

以下之间到底有什么区别(如果有的话):

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/

相关文章:

eclipse - 在 Perl 中使用 "use"时编译失败

perl - 将标量和散列传递给 Perl 中的子程序

perl - 将 STDOUT 和 STDERR 重定向到文件,除了 system() 的标准输出/错误

perl - Perl 脚本可以修改自身吗?

php - Perl exec ('/usr/bin/php -v' ) 在 CentOS 6.6 上挂起,除非先关闭 STDIN

perl - 有没有办法重用 perlpod 文档中的文本?

arrays - 散列数组中的散列

perl - 我应该使用 $_[0] 还是在 Perl 中复制参数列表?

regex - 正则表达式 。*?和 。*

perl - 难以理解混淆的 Perl 方法