在perl中为子例程指定形式参数时,我知道以下表示法。我不确定它们到底是什么意思,但是形成上下文线索并看到其他人解释了他们的代码,我得出了很多结论:
sub method1($$){...} <-- Means it takes in two scalar parameters
sub method2(@){...} <-- Means it takes in a bunch of parameters as a hash
sub method3($@){...} <-- Menas it takes in a scalar parameter, then a bunch of other parameters as a hash.
但是,我也发现了这种表示法,并且不知道它的含义:
sub method4(@;$)
从功能上说,@;$
的形式参数声明做什么而@$
没有?
答案 0 :(得分:4)
此功能称为prototypes,它不是正式的参数规范,而是一个规则集,用于解析器如何解析传递给子例程的参数。进行一些基本的Arity检查和强制(有时会使用户感到惊讶)。该功能的文档中对此进行了解释:
分号(;)将强制参数与可选参数分开。 @或%之前是多余的,它将吞噬其他所有内容。
完全不使用原型通常要比冒原型可能引起的混乱容易。一些示例:$
参数将被强制进入标量上下文,即使它是一个数组,并且在将该子例程作为对象或类方法调用时,原型也会被完全忽略(因为尚未确定将使用哪个子例程)在解析呼叫时被调用)。
对于正式的参数规范,请使用signatures功能或Function::Parameters(目前具有功能完整的优势-签名的更多功能是coming soon)。