究竟是什麼區別(如果有的話)之間:和帶有和不帶圓括號的Perl子聲明有什麼區別?
sub foobar() {
# doing some stuff
}
sub foobar {
# doing some stuff
}
我看到一些各自的,並且第一語法有時編譯失敗。
究竟是什麼區別(如果有的話)之間:和帶有和不帶圓括號的Perl子聲明有什麼區別?
sub foobar() {
# doing some stuff
}
sub foobar {
# doing some stuff
}
我看到一些各自的,並且第一語法有時編譯失敗。
通過把()
放在子程序名的末尾,你就給它一個原型。一個原型給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開始,實驗性「簽名」功能正在進行測試,希望能夠完成其他語言的程序員從原型中期望獲得的許多目標。
「關於參數的數量和類型的提示」如果你閱讀someones腳本,這是一個有價值的信息。將這些提示放在代碼中是否值得?你能說出爲什麼大多數人會避免它嗎? – Matthias
Tom Christiansen [寫道](http://www.perlmonks.org/?node_id=861966)比我想象的要好得多。 –
@Matthias如果T.C.的P.M. post是TL; DR,你可以考慮perl的數組和散列類型的含糊性; 'foo($ a,$ b)'也可能是'foo(@args)'等等。之後,世界分裂成兩個陣營,那些恐怖的人會逃跑並且遠離語言他們可以,以及將其視爲天才或運氣的人。請記住它也是一種具有完善文檔樣式(POD)的語言,並且這可能被認爲是*動態類型**語言的適當職責分離。 – delicateLatticeworkFever
第一個原型說函數不帶任何參數;第二個不是原型,也沒有提出任何有關論據。使用第二種形式。參見[遠遠超過你想知道Perl中的原型](http://www.perlmonks.org/?node_id=861966)。 –
在'5.20' *實驗*函數簽名中也使用parens,http://www.effectiveperlprogramming.com/2015/04/use-v5-20-subroutine-signatures/ –