Как проверить, установлен ли модуль 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.:)