亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

什么時候應該使用&調用Perl子例程?

什么時候應該使用&調用Perl子例程?

MMTTMM 2019-12-11 10:10:19
我聽說人們不應該&習慣于調用Perl潛艇,即:function($a,$b,...);# opposed to&function($a,$b,...);我知道其中一個參數列表是可選的,但是在什么情況下適合使用&和哪些情況下您絕對不應該使用它呢?另外,省略時如何提高性能&呢?
查看完整描述

3 回答

?
ibeautiful

TA貢獻1993條經驗 獲得超6個贊

IMO,唯一有理由使用的時間&是,如果您正在獲取或調用代碼引用,例如:


sub foo() {

    print "hi\n";

}


my $x = \&foo;

&$x();

主要的時間,你可以,你使用它絕對不應該在大多數情況下,調用一個已具雛形,指定任何非默認調用行為子時。我的意思是,某些原型允許重新解釋參數列表,例如將引用轉換@array和指定%hash為引用。因此,潛艇將期望發生這些重新解釋,并且除非您進行任何必要的長度以手工模擬它們,否則潛艇將獲得與預期的輸入完全不同的輸入。


我認為主要是人們試圖告訴您您仍在以Perl 4風格進行編寫,而我們現在有了一個更干凈,更好的東西,稱為Perl 5。


關于性能,Perl有多種方法可以優化&失敗的子調用,其中一種主要方法是常量的內聯。


在某些情況下,使用&可以帶來性能上的好處:如果您要轉發帶有的子呼叫foo(@_)。使用&foo比無限快foo(@_)。除非您通過分析明確確定需要微優化,否則我不建議您這樣做。



查看完整回答
反對 回復 2019-12-13
?
蝴蝶不菲

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以查看不應該使用的內置名稱列表。


禁用原型。如果您不知道這意味著什么或為什么想要它,請不要使用&。一些黑魔法代碼可能需要它,但是在這種情況下,您可能知道自己在做什么。


取消引用并執行子例程引用。只需使用->符號即可。



查看完整回答
反對 回復 2019-12-13
  • 3 回答
  • 0 關注
  • 716 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號