2010-02-04 69 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);