sam*_*mmy 4 perl module dynamic subroutine
我正在寻找构建一个调度表来调用我写的许多Perl模块.
举个例子,如果我有一个Hello.pm
带有简单函数的包hello()
,我想获得这个函数的代码引用.
以下不起作用:
my $code_ref=\&Hello->hello();
$code_ref->();
Run Code Online (Sandbox Code Playgroud)
但是如果从包中导出函数hello,则以下工作原理:
my code_ref=\&hello;
code_ref->();
Run Code Online (Sandbox Code Playgroud)
有没有人知道第一种情况的正确语法?或者这根本不可能?
最后,我想用我的所有代码引用填充哈希表.
#####感谢所有答案几个答案指出的正确调用是:
my $code_ref=\&Hello::hello;
$code_ref->();
Run Code Online (Sandbox Code Playgroud)
我在10个不同的文件中有10个模块,我想在调度表中加载.这使我更容易将配置作为数据加载,并与代码分开.这允许我在测试平台中加载其他模块而无需修改我的代码 - 只需修改配置文件即可.高阶Perl的作者Mark Dominus对此有一些很好的例子.
如果你想在Hello模块中引用hello sub,那么调用它,使用:
my $code_ref = \&Hello::hello;
$code_ref->();
Run Code Online (Sandbox Code Playgroud)
如果要在Hello中调用名为"hello"的方法,可以这样做:
my $method = "hello";
Hello->$method();
Run Code Online (Sandbox Code Playgroud)
\&NAME
引用一个子.Hello->hello()
不是子名称.作为表达式,它将是一个方法调用.
要获取对方法的引用,请使用can
.
my $method_ref = Hello->can('hello');
Run Code Online (Sandbox Code Playgroud)
如有必要,这将搜索继承树.现在你有了对正确方法的引用,你可以调用它:
Hello->$method_ref()
-or-
$method_ref->('Hello')
Run Code Online (Sandbox Code Playgroud)
如果你需要一个无法正确调用方法的回调,你需要创建一个回调.
my $code_ref = sub { Hello->hello(@_) };
Run Code Online (Sandbox Code Playgroud)
这就是完全动态的样子:
my $pkg = 'Hello'; # Also works with object!
my $method_name = 'hello';
my $method_ref = $pkg->can($method_name);
my $callback = sub { $pkg->$method_ref(@_) };
Run Code Online (Sandbox Code Playgroud)