3 回答

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

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