Module :: Load:查明模块是否由于错误而无法加载,或者根本不存在

时间:2011-08-05 13:20:22

标签: perl

我想要一个模块使用Module :: Load动态加载插件。如果没有这样的插件,那就没关系,但如果它在那里并且失败加载,我想采取行动(例如发出警告,甚至死亡)。

临时解决方案看起来像$@ !~ /^Couldn't locate /,但是,我发现它没有防弹。例如。模块可能需要另一个不存在的模块,或者使用Module :: Load本身,或等等。

Module::Load本身并不复杂,所以我甚至考虑在那里添加一个包变量(例如$Module::Load::Absent),但我不确定它是否有意义。

所以,问题是:如何告诉load丢失的模块加载有缺陷的模块?

3 个答案:

答案 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;
    }
}