perl如何在动态导入模块时访问func

时间:2011-09-02 08:57:45

标签: perl function module require

我有一个看起来像这样的模块:

package Test;
use strict;
use warnings;

sub hello {
    my $val = shift
    print "val = $val\n";
}

在另一个模块中,我将这样插入:

my $module = 'Test'
eval "require $module";

如何在第二个模块中调用函数hello /我的意思是函数不像方法/。

3 个答案:

答案 0 :(得分:3)

您可以使用符号引用:

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

答案 1 :(得分:2)

另一种方式:

$module->can('hello')->('test');

答案 2 :(得分:1)

您可以在此目的中使用相同的eval:

my $module = 'Test'
eval "require $module";

eval $module . "::hello()";

您还可以访问符号表并获取所需子代码的引用:

my $code = do { no strict 'refs'; \&{ $module . '::hello' } };
$code->();

但这看起来并不那么干净。

但是,如果您需要对包名称进行类似方法的调用,则可以使用:

$module->new();

这也很有用