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

10

我正试图弄清楚如何使一个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个回答

26
TMTOWTDI

定义函数引用:

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

解引用:

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

11
如果$ref是一个方法(希望第一个参数是$self),并且您想要在您的$self上调用它,语法如下:
$self->$ref(@args)

2
在这种调用方式中需要注意的重要事项是,$self 不用于确定调用哪个方法(通常在以面向对象的方式调用方法时会使用 $self)——该方法仅从 $ref 确定,而 $self 仅作为 $ref 的第一个参数传递。与此相反,如果 $ref 只是一个方法的名称,则我们将开始在 $self 上查找该方法,然后沿着继承树向上查找。 - Ether
9
@Jonathan:让我们不要把SO [perl]变成一群垂涎的粉丝团.. Jon Skeet的粉丝已经够烦人了。:/ - Ether
5
我有一个梦想,那就是答案应该根据其内容而不是发布者来投票。 - Brad Gilbert

8
请使用以下内容:
$self->$ref();

使用这个语法,$ref 可以是对子程序的引用,甚至可以是要调用的方法名称的字符串,例如:
my $ref = "foo";
$self->$ref();

需要注意的是,这两个在继承方面的语义略有不同。

当没有传递显式参数时,括号是可选的:

$self->$ref;  # also flies

否则,请使用。
$self->$ref($arg1, \%arg2, @others);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接