1) sub name() {....}
2) sub name {....}
3) sub name ($j,$j) {.....}
這三個是在Perl中聲明子程序的不同方法。想知道它們之間的區別。
1) sub name() {....}
2) sub name {....}
3) sub name ($j,$j) {.....}
這三個是在Perl中聲明子程序的不同方法。想知道它們之間的區別。
Perl有一個名爲的原型,它改變了編譯時如何解析該子例程的調用。此功能對聲明參數列表沒有用處。原型非常有限,必須在調用子之前進行聲明。
sub name()
聲明,本次不帶任何參數。用參數調用該子文件是編譯錯誤: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
。原型子語言中允許的唯一字符爲:
$
標量上下文。在參考規範中:標量@
列表上下文,slurpy。在參考規範中:array%
list context,slurpy。在參考規範中:hash*
glob或事物強制爲一個glob&
子例程。在初始位置:裸碼塊_
標量或$_
+
收集參考。打破對象。的必需的參數;
端x
類型的\x
參考其中x是$%@*&
\[…]
,可以是任何類型的在括號的參考。在Perl中,參數通過@_
數組傳遞,並在子例程內解壓縮爲my ($i, $j) = @_
。原型與此無關。
然而,有一些語法擴展劫持該位置來聲明參數(而不是原型)。通過signatures
,可以使用sub foo($x, $y)
等聲明。其他模塊如Function::Parameters
和Kavorka
會引入新的關鍵字(func
或fun
),並允許其他功能,如類型,約束,關鍵字參數等。
[的perldoc perlsub](http://perldoc.perl.org/perlsub.html) – squiguy
原型在[的perldoc perlsub](http://perldoc.perl.org/perlsub。HTML#原型)。 '3)'無效:'perl -we'子名($ j,$ j){}'' –