我有一个看起来像这样的模块:
package Test;
use strict;
use warnings;
sub hello {
my $val = shift
print "val = $val\n";
}
在另一个模块中,我将这样插入:
my $module = 'Test'
eval "require $module";
如何在第二个模块中调用函数hello /我的意思是函数不像方法/。
答案 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();
这也很有用