2012-12-29 31 views
4

我正在研究构建调度表来调用我编写的一些Perl模块。例如,如果我有一个名为Hello.pm的软件包,其中包含一个简单函数hello(),我希望获得该函数的代码引用。调用一个模块函数通过引用

下不起作用:

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

但如果功能招呼从包装出口,那么以下工作:

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

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

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

#####感谢所有的答案

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

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

我有10个不同的文件中的某些10个模块,我想在加载调度表。 这使我更容易将配置作为数据加载,并与代码分开。 这允许我在测试平台中加载额外的模块而不修改我的代码 - 只需修改配置文件即可。 Mark Dominus是Higher Order Perl的作者,在这方面有一些很好的例子。

+0

感谢您指出了这一点。我终于想出了如何接受。 – sammy

回答

8

如果你想引用的Hello模块中的Hello子,然后调用它,使用:

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

如果你想调用的方法命名为你好“你好”,你能做到这样的:

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

::没有工作。毕竟,这相当于 - >。我只是在了解如何在没有导出函数名称的情况下建立对模块中函数的引用。 – sammy

+0

它适合我。并且' - >'不等同于'::' – PSIAlt

+0

'Foo-> bar()'中的' - >'等价于'Foo :: bar('Foo')'。 ''''''意味着它前面的任何东西(比如一个对象或者一个类的名称)都会被传递给被调用的第一个参数。用'Foo :: bar()',情况并非如此。 – simbabque

3

你可能想要的是

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

除了缺失的美元符号(它们必须是拼写错误,因为如果没有它们,代码甚至不能编译),这正是OP已经_has_。 –

+0

这里没有美元符号。我们只是建立一个由Hello Module导出的函数的引用。上面的代码有效。我的简单问题是为什么我无法建立对Hello-> hello()目录的引用。 – sammy

+1

其错误的客户端其模块'你好''你好'' – PSIAlt

6

\&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(@_) };