2015-07-13 49 views
6

究竟是什麼區別(如果有的話)之間:和帶有和不帶圓括號的Perl子聲明有什麼區別?

sub foobar() { 
    # doing some stuff 
} 

sub foobar { 
    # doing some stuff 
} 

我看到一些各自的,並且第一語法有時編譯失敗。

+6

第一個原型說函數不帶任何參數;第二個不是原型,也沒有提出任何有關論據。使用第二種形式。參見[遠遠超過你想知道Perl中的原型](http://www.perlmonks.org/?node_id=861966)。 –

+2

在'5.20' *實驗*函數簽名中也使用parens,http://www.effectiveperlprogramming.com/2015/04/use-v5-20-subroutine-signatures/ –

回答

9

通過把()放在子程序名的末尾,你就給它一個原型。一個原型給Perl提示了你將要傳遞給子例程的參數的數量和類型。詳情請參閱this section in perlsub

具體來說,()是一個空的原型,它告訴Perl該子程序不接受任何參數,如果你用參數調用該子程序,Perl將拋出一個編譯錯誤。下面是一個例子:

#!/usr/bin/perl 

use strict; 
use warnings; 
use 5.010; 

sub foo { 
    say 'In foo'; 
} 

sub bar() { 
    say 'In bar'; 
} 

foo(); 
bar(); 
foo(1); 
bar(1); 

輸出從這個是:

Too many arguments for main::bar at ./foobar line 18, near "1)" 
Execution of ./foobar aborted due to compilation errors. 

它到bar()最後一次調用(具有1參數),這會導致此錯誤。

值得注意的是,Perl的原型實現通常不如人們經常認爲的那樣有用,並且除了一些特殊情況外,大多數Perl專家都會避免它們。我建議你也這樣做。從Perl v5.22開始,實驗性「簽名」功能正在進行測試,希望能夠完成其他語言的程序員從原型中期望獲得的許多目標。

+0

「關於參數的數量和類型的提示」如果你閱讀someones腳本,這是一個有價值的信息。將這些提示放在代碼中是否值得?你能說出爲什麼大多數人會避免它嗎? – Matthias

+4

Tom Christiansen [寫道](http://www.perlmonks.org/?node_id=861966)比我想象的要好得多。 –

+1

@Matthias如果T.C.的P.M. post是TL; DR,你可以考慮perl的數組和散列類型的含糊性; 'foo($ a,$ b)'也可能是'foo(@args)'等等。之後,世界分裂成兩個陣營,那些恐怖的人會逃跑並且遠離語言他們可以,以及將其視爲天才或運氣的人。請記住它也是一種具有完善文檔樣式(POD)的語言,並且這可能被認爲是*動態類型**語言的適當職責分離。 – delicateLatticeworkFever

相關問題