2014-01-12 56 views
4

雖然試圖瞭解關閉,讀通perl-faqcoderefperlref發現這些例子:

sub add_function_generator { 
    return sub { shift() + shift() }; 
} 
my $add_sub = add_function_generator(); 
my $sum = $add_sub->(4,5); 

sub newprint { 
    my $x = shift; 
    return sub { my $y = shift; print "$x, $y!\n"; }; 
} 
$h = newprint("Howdy"); 
&$h("world"); 

這裏有兩種形式調用存儲在一個變量的函數。

&$func($arg) 
$func->($arg) 

那些是完全等同的(僅語法不同),或者這裏有一些區別在哪裏?

回答

13

沒有區別。證明:每個版本生成的操作碼:

$ perl -MO=Concise -e'my $func; $func->()' 
8 <@> leave[1 ref] vKP/REFC ->(end) 
1  <0> enter ->2 
2  <;> nextstate(main 1 -e:1) v:{ ->3 
3  <0> padsv[$func:1,2] vM/LVINTRO ->4 
4  <;> nextstate(main 2 -e:1) v:{ ->5 
7  <1> entersub[t2] vKS/TARG ->8 
-  <1> ex-list K ->7 
5   <0> pushmark s ->6   
-   <1> ex-rv2cv K ->-   
6    <0> padsv[$func:1,2] s ->7 
$ perl -MO=Concise -e'my $func; &$func()' 
8 <@> leave[1 ref] vKP/REFC ->(end)  
1  <0> enter ->2      
2  <;> nextstate(main 1 -e:1) v:{ ->3 
3  <0> padsv[$func:1,2] vM/LVINTRO ->4 
4  <;> nextstate(main 2 -e:1) v:{ ->5 
7  <1> entersub[t2] vKS/TARG ->8  
-  <1> ex-list K ->7    
5   <0> pushmark s ->6   
-   <1> ex-rv2cv sKPRMS/4 ->-  
6    <0> padsv[$func:1,2] s ->7 

...等等,居然有在標誌爲- <1> ex-rv2cv sKPRMS/4 ->-細微的差別。無論如何,他們似乎並不重要,而且兩種表現都是一樣的。

但我會建議使用表單$func->():我認爲這種語法更優雅,你可以不小心忘了用括號(&$func作品,但使當前@_的功能,這是不是你可見通常我想要)。

+2

+10提及'@ _'的可見性。 – jm666

+0

perl -MB = Deparse的結果可能更容易閱讀,並且還顯示兩個變體被認爲是相同的,例如, deparse將$ func - >()轉換爲&$ func() –

相關問題