引用包中的方法
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!");
我正在尝试找到一个通用的解决方案来获取对模块中方法的引用。假设我们有一个 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!");