通过引用调用模块函数

时间:2012-12-29 00:51:50

标签: perl dynamic module subroutine

我正在构建一个调度表,用于调用我编写的许多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个模块,我想在调度表中加载。 这使我更容易将配置作为数据加载,并与代码分开。 这允许我在测试平台中加载其他模块而无需修改我的代码 - 只需修改配置文件即可。高阶Perl的作者Mark Dominus对此有一些很好的例子。

3 个答案:

答案 0 :(得分:9)

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

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

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

my $method = "hello";
Hello->$method();

答案 1 :(得分:7)

\&NAME引用了一个sub。 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(@_) };

答案 2 :(得分:3)

你可能想要的是

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