如何在Perl模块中编写函数引用?

时间:2010-02-04 16:58:40

标签: 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)解引用它的正确语法是什么?

3 个答案:

答案 0 :(得分:23)

TMTOWTDI

定义函数引用:

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

<强>解引用:

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

答案 1 :(得分:9)

如果$ref是一个方法(期望$self作为第一个参数)并且您想要调用它 您的$self,语法为:

$self->$ref(@args)

答案 2 :(得分:6)

使用以下内容:

$self->$ref();

使用这种语法,$ref可以是对子程序的引用,甚至是带有要调用的方法名称的字符串,例如

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

请注意,这两者在继承方面的语义略有不同。

如果未传递显式参数,则括号是可选的:

$self->$ref;  # also flies

否则,请使用

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