我想要一个模块使用Module :: Load动态加载插件。如果没有这样的插件,那就没关系,但如果它在那里并且失败加载,我想采取行动(例如发出警告,甚至死亡)。
临时解决方案看起来像$@ !~ /^Couldn't locate /
,但是,我发现它没有防弹。例如。模块可能需要另一个不存在的模块,或者使用Module :: Load本身,或等等。
Module::Load
本身并不复杂,所以我甚至考虑在那里添加一个包变量(例如$Module::Load::Absent
),但我不确定它是否有意义。
所以,问题是:如何告诉load
丢失的模块加载有缺陷的模块?
答案 0 :(得分:3)
您可能希望改为use Module::Load::Conditional
。它能够check_install
并检查can_load
,以便您了解您的模块是否已安装且无法加载。
use Carp;
use Module::Load::Conditional;
if ( check_install( module => 'Data::Dumper' ) ) {
if ( can_load( modules => { 'Data::Dumper' => undef } ) ) { # any version of Data::Dumper
requires 'Data::Dumper'; # load Data::Dumper part of ::Conditional
}
else {
carp 'can\'t load Data::Dumper';
}
}
else {
carp 'Data::Dumper not installed';
}
答案 1 :(得分:0)
我会尝试以下方法:
use Module::Load;
my $module = 'Data:Dumper';
if (load $module)
{
# Success
}
else
{
# Fail
}
答案 2 :(得分:0)
要查明是否没有这样的插件,你可以遍历@INC并检查是否存在应该包含该模块的文件,如下所示(当然未经测试:):
use File::Spec::Functions;
my $filename = catfile(split('::', $modulename)) . '.pm';
foreach my $path (@INC) {
if ( -f catfile($path, $filename)) {
# found it!
last;
}
}