2013-12-21 90 views
0
1) sub name() {....} 

2) sub name {....} 

3) sub name ($j,$j) {.....} 

這三個是在Perl中聲明子程序的不同方法。想知道它們之間的區別。

+1

[的perldoc perlsub](http://perldoc.perl.org/perlsub.html) – squiguy

+3

原型在[的perldoc perlsub](http://perldoc.perl.org/perlsub。HTML#原型)。 '3)'無效:'perl -we'子名($ j,$ j){}'' –

回答

5

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::ParametersKavorka會引入新的關鍵字(funcfun),並允許其他功能,如類型,約束,關鍵字參數等。