Perl 使用eval加载模块

Perl 使用eval加载模块,perl,module,load,runtime,eval,Perl,Module,Load,Runtime,Eval,我在Perl和内置函数方面遇到了一些问题。 我已经在网上查过了,但找不到任何答案或示例代码 我希望动态加载模块(在执行之前我不知道它们) 回报是: 重新授权测试::测试(自定义::日志=哈希(0x1194468)) 以下方法对我有效,但我不能用同一子例程加载多个模块: my $use = "use ".$module_name." qw(&test)"; $ret = eval $use; # Debug for eval $log->debug ($@) if $@; $re

我在Perl和内置函数方面遇到了一些问题。 我已经在网上查过了,但找不到任何答案或示例代码

我希望动态加载模块(在执行之前我不知道它们)

回报是:

重新授权测试::测试(自定义::日志=哈希(0x1194468))

以下方法对我有效,但我不能用同一子例程加载多个模块:

my $use = "use ".$module_name." qw(&test)";
$ret = eval $use;

# Debug for eval
$log->debug ($@) if $@;

$ret = test($log);
感谢您提供的帮助。

请改用。

在第一个代码片段中

"use ".$module_name;
只是作为字符串计算。这是因为字符串
eval
和块
eval
之间存在差异。请参阅文档以了解它们之间的差异

您可以使用以下内容:

use strict; use warnings;

my $module_name = "Auth_Auth_Test";
eval "require $module_name";
if($@) {
    warn "Could not load module: $@\n";
}
my $ret = $module_name->test("params");
print "return $ret\n";

但无论如何,daxim的建议是合理的,您可能不想重新发明已经用perl发布的东西。从5.9.4开始,它就在核心中。

我强烈建议您使用它,因为它依赖于驼鹿,所以现在无处不在:

use Class::Load qw(:all);

my $module = 'Web::Spider::' . $module;
try_load_class($module)
    or warn "unable to load '$module'";
下面是关于为什么它比Module::Load更好的详细解释(尽管后者是Perl核心的一部分):

TL;博士:

Perl 5.8函数(现在在5.10中解决)的一个奇怪之处是,一旦需要一个模块,只要该文件存在于磁盘上,$INC{}就会被更新,以将模块名映射到找到的文件名。这似乎并不坏,直到你看到它在其他地方被再次调用时的表现


Load解决了这个问题。模块::Load没有。

在PerlV5.8上它“有点”崩溃;有关更多详细信息,请参见我的答案。包含在Perl核心中。Module::Load最初是在PerlV5.9.4中发布的(在此之前的任何版本都不受官方支持)。
use Class::Load qw(:all);

my $module = 'Web::Spider::' . $module;
try_load_class($module)
    or warn "unable to load '$module'";