我需要动态包含 Perl 模块,但如果可能的话,由于工作编码标准,我希望远离 eval。这有效:
$module = "My::module";
eval("use $module;");
但我需要一种方法来做到这一点,而不需要eval
如果可能的话。所有谷歌搜索都会导致eval
方法,但没有任何其他方式。
是否可以在没有的情况下做到这一点eval
?
Use require http://perldoc.perl.org/functions/require.html在运行时加载模块。将其包装在一个块(而不是字符串)中通常是个好主意eval
以防模块无法加载。
eval {
require My::Module;
My::Module->import();
1;
} or do {
my $error = $@;
# Module load failed. You could recover, try loading
# an alternate module, die with $error...
# whatever's appropriate
};
原因是eval {...} or do {...}
语法并复制$@
是因为$@
是一个全局变量,可以由许多不同的事物设置。您希望尽可能以原子方式获取该值,以避免其他因素将其设置为不同值的竞争条件。
如果您直到运行时才知道模块的名称,则必须手动在模块名称 (My::Module) 和文件名 (My/Module.pm) 之间进行转换:
my $module = 'My::Module';
eval {
(my $file = $module) =~ s|::|/|g;
require $file . '.pm';
$module->import();
1;
} or do {
my $error = $@;
# ...
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)