我试图找到一个通用的解决方案来获取模块中方法的引用。假设我们有一个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');
有什么想法吗? 谢谢!
答案 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!");