Perl 没有类型签名或形式参数,这与 C 等其他语言不同:
// C code
int add(int, int);
int sum = add(1, 2);
int add(int x, int y) {
return x + y;
}
传统的 Perl 方法
相反,参数只是作为平面列表传递。任何类型验证都发生在您的代码中;您必须手动编写(但见下文)。您必须自己将 arglist 解压缩到命名变量中。而且您通常不会预先声明您的子例程:
my $sum = add(1, 2);
sub add {
my ($x, $y) = @_; # unpack arguments
return $x + $y;
}
如果您预先声明您的潜艇,您将获得以下信息:
- 您可以在没有括号的情况下调用潜艇
- 您可以使用“原型”更改解析参数的方式</li>
子程序原型
原型可以说
- 在标量上下文中评估此参数:
sub foo($)
,或
- 此参数必须是哈希变量,请将其作为参考传递:
sub foo(\%)
,或
- 这个 sub 没有参数:
sub foo()
等。
不要使用这些来验证参数的数量。实际上,根本不要使用它们;他们在远处引起行动。它们对于类型验证也没有用。
您的错误源于您将 sub 声明为 nullary 的事实,这导致了parse error。
签名
如果您希望能够使用命名参数声明子例程,则可以使用实现这些参数的模块。
从 Perl 5.20 开始,您可以use feature 'signatures'
. 它仍被标记为实验性的,但基本语法不太可能改变。
use feature 'signatures';
no warnings 'experimental::signatures'
sub add($x, $y) { ... }
有各种 CPAN 模块,例如Method::Signatures
. 它们可能具有集成类型检查等优点,但也可能比在 Core Perl 中实现的解决方案更容易出错。
use Method::Signatures;
func add(Int $x, Int $y) { ... }
然而,这些“签名”与普通潜艇的原型无关。