1) sub name() {....}
2) sub name {....}
3) sub name ($j,$j) {.....}
这三种是在Perl中声明子程序的不同方法。 想知道它们之间的区别。
答案 0 :(得分:5)
Perl有一个名为 prototypes 的功能,它可以改变在编译时解析该子例程的调用的方式。此功能对声明参数列表没有用。原型非常有限,必须在调用sub之前声明。
sub name()
声明此sub不带任何参数。使用参数调用该sub是一个编译错误:name(1)
以Too many arguments for main::name
中止。如果您在声明之前调用该子,则会收到可选的main::name() called too early to check prototype
警告。
sub name
是常规表单,没有您应该经常使用的任何原型。它被等效地解析为原型(@)
。
sub name($i, $j)
是编译错误:Illegal character in prototype for main::name
。原型子语言中允许的唯一字符是:
$
标量上下文。在referene规范:标量@
列出上下文,slurpy。在参考规范:array %
列出上下文,slurpy。在参考规范中:hash *
glob或者可以强化为glob的东西&
子程序。在初始位置:裸代码块_
标量或$_
+
收集参考。打破对象。;
所需参数的结尾\x
类型为x
的引用,其中x为$%@*&
\[…]
引用可以是括号中的任何类型。在Perl中,参数通过@_
数组传递,并在子例程中解压缩为my ($i, $j) = @_
。原型与此无关。
然而,有一些语法扩展劫持了这个位置来声明参数(而不是原型)。对于signatures
,可以使用sub foo($x, $y)
之类的声明。其他模块(如Function::Parameters
和Kavorka
)会引入新关键字(func
或fun
)并允许其他功能,如类型,约束,关键字参数,....