perl如何在动态导入模块时访问func
Posted
技术标签:
【中文标题】perl如何在动态导入模块时访问func【英文标题】:perl how to access func when the module is imported on the fly 【发布时间】:2011-11-09 00:31:31 【问题描述】:我有一个如下所示的模块:
package Test;
use strict;
use warnings;
sub hello
my $val = shift
print "val = $val\n";
在另一个模块中,我像这样插入这个:
my $module = 'Test'
eval "require $module";
如何在第二个模块中调用函数你好/我的意思是像一个函数而不是一个方法/。
【问题讨论】:
【参考方案1】:您可以使用符号引用:
no strict 'refs'; # disable strictures for the enclosing block
& $module . '::hello' ;
或者,您可以将函数导出到调用包(参见Exporter):
package Test;
use Exporter 'import';
our @EXPORT = qw(hello);
sub hello
...
然后在你的代码中:
my $module = 'Test'
eval "use $module";
hello("test");
【讨论】:
在最后一种情况下,eval
必须更改为 a) use
而不是 require
或 b) import
必须手动调用。至少我是这么认为的……【参考方案2】:
另一种方式:
$module->can('hello')->('test');
【讨论】:
【参考方案3】:您可以在此目的中使用相同的 eval:
my $module = 'Test'
eval "require $module";
eval $module . "::hello()";
您还可以访问符号表并获取所需子代码的参考:
my $code = do no strict 'refs'; \& $module . '::hello' ;
$code->();
但这看起来不太干净。
但是,如果您需要对包名称进行类似方法的调用,则可以使用:
$module->new();
这也很有用
【讨论】:
我会在任何一天对eval EXPR
的这种用法进行第二次 sn-p。以上是关于perl如何在动态导入模块时访问func的主要内容,如果未能解决你的问题,请参考以下文章
Node.js 和 Typescript,如何动态访问导入的模块