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,如何动态访问导入的模块

如何使模块导入已导入模块的模块

如何动态导入作为json数据的反应模块

在 Python 中,如何从导入的模块访问主模块的命名空间?

Angular 模块导入的动态配置

python------Socket网略编程+动态导入模块