Module :: Load: выяснить, не удалось ли загрузить модуль из-за ошибки или просто не существует - PullRequest
3 голосов
/ 05 августа 2011

Я хочу, чтобы модуль динамически загружал плагины, используя Module :: Load. Если такого плагина нет, все в порядке, но , если , то он есть, а не удается загрузить , я хочу предпринять действия (например, дать предупреждение или даже умереть).

Временное решение выглядит как $@ !~ /^Couldn't locate /, однако я не считаю его пуленепробиваемым. Например. модуль может потребовать другой модуль, который отсутствует, или использовать Module :: Load непосредственно, и т. д.

Сам Module::Load не так уж и сложен, поэтому я даже подумывал добавить туда переменную пакета (например, $Module::Load::Absent), но я не уверен, что это имеет смысл.

Итак, вопрос: как я могу load сообщить отсутствующему модулю о загрузке неисправного?

Ответы [ 3 ]

3 голосов
/ 05 августа 2011

Вы можете вместо этого 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';
}
0 голосов
/ 05 августа 2011

Чтобы выяснить, нет ли такого плагина, вы можете перебрать @INC и проверить, существует ли файл, который должен содержать модуль, что-то вроде следующего (непроверено, конечно:):

use File::Spec::Functions;

my $filename = catfile(split('::', $modulename)) . '.pm';
foreach my $path (@INC) {
    if ( -f catfile($path, $filename)) {
       # found it!
       last;
    }
}
0 голосов
/ 05 августа 2011

Я бы попробовал следующее:

use Module::Load;

my $module = 'Data:Dumper';

if (load $module)
{
    # Success
}
else
{
    # Fail
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...