2012-06-08 43 views

回答

4
  1. PACKAGE->can($fn),其中PACKAGE爲main默認值。
  2. defined &{$fn}

can也會如果存在的話,你代碼引用回到這個功能。

+0

對於'PACKAGE-> can($ fn)'(通常是'main-> can($ fn)')+1。 'defined'測試讓我發癢 –

+0

是的,的確,PACKAGE-> can真的是我想要的。我認爲定義&{$ fn}會起作用,但搞亂了我的簡單測試。這就像堆棧溢出一樣對編程。謝謝。 – Don

5

您可能會傾向於使用can方法,但這是錯誤的,它會導致誤報,因爲它服從繼承。你想使用exists

my $name = ...; 
my @args = ...; 
die("$name doesn't exist\n") if !exists(&$name); 
(\&$name)->(@args); 

$name->(@args)就足夠沒有嚴格。奇怪的語法繞過嚴格。

+0

這是假設,當然,檢查繼承*是不希望的。 –

+0

@Robert P,這不是一個假設。這是OP所要求的(「如何測試**子程序**的名稱」)。他沒有詢問方法。對於方法來說,'存在'(或'定義'),'可以'。 – ikegami

+0

事實上,兩者都是有趣的情況,但我的是我有一個主程序,調用一個包中的子程序。在該子程序中,我需要知道是否可以調用給定的名稱,可以在主程序中或其他一些裝入的程序包中,包括我的。 – Don