问题是Perl的函数原型并不像人们想象的那样。它们的目的是允许您编写像Perl内置函数那样解析的函数。首先,方法调用完全忽略原型。如果您正在进行OO编程,那么您的方法有什么原型并不重要。(所以他们不应该有任何原型。)第二,原型没有严格执行。如果您使用&function(...),原型被忽略了。所以他们不能提供任何类型的安全。第三,他们是恐怖的远程行动。(特别是$Prototype,它导致在标量上下文中计算相应的参数,而不是默认的列表上下文。)特别是,它们使得很难从数组中传递参数。例如:my @array = qw(a b c);foo(@array);foo(@array[0..1]);foo($array[0], $array[1], $array[2]);sub foo ($;$$)
{ print "@_\n" }foo(@array);foo(@array[0..1]);foo($array[0], $array[1], $array[2]);指纹:a b c
a b
a b c3b
a b c还有3条警告main::foo() called too early to check prototype(如果启用了警告)。问题是,在标量上下文中计算的数组(或数组片)返回数组的长度。如果您需要编写一个功能类似于内置的函数,请使用原型。否则,不要使用原型。注意:Perl 6将进行完全修改,并且非常有用的原型。这个答案只适用于Perl 5。