3 回答

TA貢獻1993條經驗 獲得超6個贊
IMO,唯一有理由使用的時間&是,如果您正在獲取或調用代碼引用,例如:
sub foo() {
print "hi\n";
}
my $x = \&foo;
&$x();
主要的時間,你可以,你使用它絕對不應該在大多數情況下,調用一個已具雛形,指定任何非默認調用行為子時。我的意思是,某些原型允許重新解釋參數列表,例如將引用轉換@array和指定%hash為引用。因此,潛艇將期望發生這些重新解釋,并且除非您進行任何必要的長度以手工模擬它們,否則潛艇將獲得與預期的輸入完全不同的輸入。
我認為主要是人們試圖告訴您您仍在以Perl 4風格進行編寫,而我們現在有了一個更干凈,更好的東西,稱為Perl 5。
關于性能,Perl有多種方法可以優化&失敗的子調用,其中一種主要方法是常量的內聯。
在某些情況下,使用&可以帶來性能上的好處:如果您要轉發帶有的子呼叫foo(@_)。使用&foo比無限快foo(@_)。除非您通過分析明確確定需要微優化,否則我不建議您這樣做。

TA貢獻1810條經驗 獲得超4個贊
我經常濫用&,但是主要是因為我在做怪異的界面設計。如果您不需要這些情況之一,請不要使用&。其中大多數只是訪問子例程定義,而不是調用子例程。全部都在perlsub中。
引用命名子例程。對于大多數Perlers來說,這可能是唯一的常見情況:
my $sub = \&foo;
類似地,分配給typeglob,這使您可以使用不同的名稱調用子例程:
*bar = \&foo;
如在測試套件中一樣,檢查是否定義了子例程:
if( defined &foo ) { ... }
刪除不常見的子例程定義:
undef &foo;
提供一個調度程序子例程,其唯一的工作就是選擇正確的子例程來調用。這是我&用來調用子例程的唯一情況,并且當我希望多次調用分派器并且需要從操作中擠出一點性能時:
sub figure_it_out_for_me {
# all of these re-use the current @_
if( ...some condition... ) { &foo }
elsif( ...some other... ) { &bar }
else { &default }
}
要使用當前參數堆棧跳入另一個子例程(并替換調用堆棧中的當前子例程),則在分配過程中會執行一個稀疏操作,尤其是在AUTOLOAD:
goto ⊂
調用以Perl內置函數命名的子例程。將&始終為您提供了用戶定義的。這就是為什么我們在Learning Perl中教它。您實際上并不是真的想正常執行此操作,但這是的功能之一&。
在某些地方可以使用它們,但是有更好的方法:
調用與Perl內置名稱相同的子例程。只是沒有與Perl內置名稱相同的子例程。檢查perlfunc以查看不應該使用的內置名稱列表。
禁用原型。如果您不知道這意味著什么或為什么想要它,請不要使用&。一些黑魔法代碼可能需要它,但是在這種情況下,您可能知道自己在做什么。
取消引用并執行子例程引用。只需使用->符號即可。
添加回答
舉報