2010-02-04 48 views
6

我想弄清楚如何使一個Perl模塊的函數參考工作。我知道如何在模塊之外做到這一點,但是在一個模塊之內?考慮這樣的代碼:如何在Perl模塊中編寫函數引用?

==mymodule.pm== 
1 sub foo { my $self = shift; ... } 
2 sub bar { my $self = shift; ... } 
3 sub zip { 
4 my $self = shift; 
5 my $ref = \&foo; 
6 $self->&$foo(); # what syntax is appropriate? 
7 } 
==eof=== 

請看上面的第5-6行。 (1)首先定義函數引用,以及(2)解引用它的正確語法是什麼?

回答

8

如果$ref是一個方法(預計$self作爲第一個參數),你怎麼稱呼它在 你$self,語法是:

$self->$ref(@args) 
+1

在這個呼叫風格需要注意的重要一點是,'$ self'是不用於確定調用哪種方法(通常情況下調用OO風格的方法時) - 該方法完全由'$ ref'確定,'$ self'僅作爲$ ref的第一個參數傳遞。如果'$ ref'只是方法的名稱,在這種情況下,我們將開始在'$ self'上查找該方法,然後繼承樹。 – Ether 2010-02-04 17:58:07

+0

Upvoted成爲Randal「one-L」Schwartz!好極了! – 2010-02-04 18:14:17

+8

@Jonathan:讓我們不要把SO [perl]變成一羣流涎的團體.. Jon Skeet球迷已經夠糟糕了。 :/ – Ether 2010-02-04 18:17:29

20

TMTOWTDI

定義函數引用:

$ref = \&subroutine; 
$ref = sub { BLOCK }; 
$ref = "subroutineName"; # or $ref = $scalarSubroutineName 

解引用:

$ref->(@args); 
&$ref; 
&{$ref}(@args); 
6

使用以下:

$self->$ref(); 

有了這個語法,$ref可以是子程序的參考或甚至一個字符串的方法的名字來稱呼,例如

my $ref = "foo"; 
$self->$ref(); 

要知道,這兩個具有相對於繼承語義稍有不同。

當你不傳遞明確的參數,括號是可選的:

$self->$ref; # also flies 

否則,使用

$self->$ref($arg1, \%arg2, @others);