参考包中的方法

时间:2015-08-31 18:02:24

标签: perl module reference dispatch

我试图找到一个通用的解决方案来获取模块中方法的引用。假设我们有一个Hello.pm模块,其中包含一个名为“hello”的方法。

在调用程序中,可以编写

use Hello;
Hello->hello('Hi There');

该模块定义为:

package Hello;
sub hello {
 my $object=shift;
 my $greeting=shift;
 say "$greeting";
 return;
}
1;

如何获取hello模块测试的代码参考? 最终我想构建一个调度表,并能够使用位于其他模块中的任意数量的方法加载它。

这不起作用:

my $code_ref=&{Hello->hello}

并像这样调用它:

$code_ref->('Hi There');

有什么想法吗? 谢谢!

2 个答案:

答案 0 :(得分:2)

您想要进行子程序调用($code_ref->(...)),但是您想要调用方法。这意味着您必须创建一个调用该方法的子例程,并获得对该子例程的引用。如下所示,这很容易做到:

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

答案 1 :(得分:1)

如果你将它用于调度表,那么让表通过传入一个密钥而不是创建一个通用的cref并告诉它从哪个类调用sub来执行繁重的工作:

use warnings;
use strict;

package Hello;
sub hello {
    my $class = shift;
    my $msg = shift;
    print "$msg\n";
}

package Bye;
sub bye {
    my $class = shift;
    my $msg = shift;
    print "$msg\n";
}

package main;

my %dt = (
    Hello => sub { Hello->hello(@_); },
    Bye => sub { Bye->bye(@_); },
);

$dt{Hello}->("hi there");
$dt{Bye}->("see ya!");