Как проверить, установлен ли модуль Perl?

Я пишу небольшой Perl script, который зависит от некоторых модулей, которые могут быть доступны, поэтому во время установки мне пришлось бы проверять, есть ли там все. Я мог бы просто написать use some::module и посмотреть, появляется ли ошибка, но короткое сообщение типа "Вам нужно установить некоторый:: модуль" было бы более полезно для конечных пользователей.

Я также мог бы просто искать каждый каталог в @INC, но поскольку он Perl, должен быть более простой способ.

Ответ 1

perl -MSome::Module -e ';'

Упс, неправильно прочитайте вопрос. Я думал, что вы хотите знать в одноразовом случае, а не обнаруживать его в восстановительной манере. Я всегда использую что-то вроде этого:

sub try_load {
  my $mod = shift;

  eval("use $mod");

  if ([email protected]) {
    #print "\[email protected] = [email protected]\n";
    return(0);
  } else {
    return(1);
  }
}

Что вы используете следующим образом:

$module = 'Some::Module';
if (try_load($module)) {
  print "loaded\n";
} else {
  print "not loaded\n";
}

Ответ 2

Как насчет:

die "Some::Module missing!" unless(eval{require Some::Module});

Ответ 3

Как вы устанавливаете свой script? Если вы используете стандартный Makefile.PL или Build.PL, листинговые зависимости тривиальны.

Ответ 4

У меня есть немного script, в котором перечислены все модули Perl в моей системе;

#!/usr/bin/perl

use ExtUtils::Installed;
my $instmod = ExtUtils::Installed->new();
foreach my $module ($instmod->modules()) {
    my $version = $instmod->version($module) || "???";
    print "$module -- $version\n";
}

Внутри цикла foreach вы можете сделать что-то вроде:

my $match;
if ($module =~ /$match/) {
  print "Found $match: $module\n";
}

Ответ 5

Я использую что-то вроде этого:

BEGIN { 
    my $module_name    = shift; # @ARGV
    our $module_exp = $module_name;
    eval "use $module_name;";
}

$module_exp =~ s{::}{/}g;
foreach my $key ( grep { m/^$module_exp\./ } keys %INC ) { 
    print "$key => $INC{$key}\n";
}

Но я использую это больше в форме функции оболочки korn:

function wherperl
{
     perl -M$1 <<EX_DOC
     my \$module = '$1';
     \$module =~ s/::/\\//g;

     for ( keys %INC ) {
         next unless m/^\$module\./;
         print \$_ . ' => ' . \$INC{\$_} . "\n";
     }
EX_DOC
}

Ответ 6

Мне нравится использовать утилиту cpan:

% cpan -D YAML
YAML
-------------------------------------------------------------------------
    YAML Ain't Markup Language (tm)
    A/AD/ADAMK/YAML-0.70.tar.gz
    /usr/local/perls/perl-5.10.0/lib/site_perl/5.10.0/YAML.pm
    Installed: 0.68
    CPAN:      0.70  Not up to date
    Ingy dot Net (INGY)
    [email protected]

Это может быть немного медленным, поскольку он должен подключаться к зеркалу CPAN для извлечения некоторых данных, но у меня также есть локальное зеркало CPAN.:)