引用包中的方法

Reference to a Method in a Package

我正在尝试找到一个通用的解决方案来获取对模块中方法的引用。假设我们有一个 Hello.pm 模块,其中有一个名为 "hello".

的方法

在调用程序中,可以这样写

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

模块定义为:

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

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

这不起作用:

my $code_ref=&{Hello->hello}

并像这样调用它:

$code_ref->('Hi There');

有什么想法吗? 谢谢!

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

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

如果您将其用于调度 table,让 table 通过传入密钥而不是创建通用 cref 并告诉它哪个 class 来完成繁重的工作] 从以下位置调用子:

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!");