4

我正在考虑构建一个调度表来调用我编写的许多 Perl 模块。

例如,如果我有一个Hello.pm包含一个简单函数的包hello(),我想获得对该函数的代码引用。

以下不起作用:

my $code_ref=\&Hello->hello();
$code_ref->();

但是,如果函数 hello 从包中导出,则以下工作:

my code_ref=\&hello;
code_ref->();

有谁知道第一种情况的正确语法?或者这根本不可能?

最后,我想用我所有的代码引用填充一个哈希表。

#####感谢所有答案

几个答案指出的正确调用是:

my $code_ref=\&Hello::hello;
$code_ref->();

我想在调度表中加载 10 个不同文件中的大约 10 个模块。这使我更容易将配置作为数据加载,并与代码分开。这允许我在测试台中加载其他模块而无需修改我的代码——只需修改配置文件。Higher Order Perl 的作者 Mark Dominus 对此有一些很好的例子。

4

3 回答 3

9

如果要引用 Hello 模块中的 hello sub,则调用它,使用:

my $code_ref = \&Hello::hello;
$code_ref->();

如果要在 Hello 中调用一个名为“hello”的方法,可以这样:

my $method = "hello";
Hello->$method();
于 2012-12-29T01:42:23.943 回答
7

\&NAME引用一个子。Hello->hello()不是子名称。作为一个表达式,它将是一个方法调用。

要获取对方法的引用,请使用can.

my $method_ref = Hello->can('hello');

如有必要,这将搜索继承树。现在您已经引用了正确的方法,您可以调用它:

Hello->$method_ref()
  -or-
$method_ref->('Hello')

如果您需要一个无法正确调用该方法的回调,则需要创建一个可以正确调用该方法的回调。

my $code_ref = sub { Hello->hello(@_) };

这是它看起来完全动态的样子:

my $pkg         = 'Hello';  # Also works with object!
my $method_name = 'hello';
my $method_ref  = $pkg->can($method_name);

my $callback = sub { $pkg->$method_ref(@_) };
于 2012-12-29T09:15:25.613 回答
3

你可能想要的是

my $code_ref = \&hello;
$code_ref->();
于 2012-12-29T00:57:19.233 回答