Существует ли умный способ обнаружить, был ли определенный модуль Perl установлен в Вашей системе? Мой старый sutpid путь состоит в том, чтобы записать сценарий Perl, в котором единственная вещь я делаю должен только использовать модуль. Если ничто не каркает, когда я запускаю обнаружить скрипт, то я знаю, что модуль был установлен, хотя я все еще не знаю, какая версия и где модуль был установлен.
заранее спасибо.
Что-то вроде:
perl -MModule -e 'print "$Module::VERSION\n"' 2>/dev/null || echo "Not installed"
даст вам версию данного модуля или скажет, что это не ' т установлен. Использование будет выглядеть так:
perl -MXML::Parser -e 'print "$XML::Parser::VERSION\n"' 2>/dev/null || echo "Not installed"
Чтобы найти путь к модулю, вы можете изучить @INC
, чтобы найти возможные местоположения, или, возможно, вы можете заглянуть в perlwhich . Также имеется pmpath из pmtools .
instmodsh
NAME
instmodsh - A shell to examine installed modules
SYNOPSIS
instmodsh
DESCRIPTION
A little interface to ExtUtils::Installed to examine installed modules, validate your packlists and even create a tarball from an installed module.
SEE ALSO
ExtUtils::Installed
Я использую эти функции bash / Perl oneliners, чтобы найти номер версии и расположение модулей Perl:
# equivalent to perldoc -l <module>
perlwhere() {
perl -wle'eval "require $ARGV[0]" or die; ($mod = $ARGV[0]) =~ s|::|/|g; print $INC{"${mod}.pm"}' $1
}
perlversion() {
perl -M$1 -wle'print $ARGV[0]->VERSION' $1
}
: [ether ~].2$; perlwhere Test::More
/usr/lib/perl5/5.8.8/Test/More.pm
: [ether ~].2$; perlversion Test::More
0.94
Я не знаю, есть ли для этого какой-нибудь разумный способ. Но что я обычно
do - это использовать параметр perldoc '-l' или '-m'. Например:
% perldoc -l XML :: Simple
, и результат будет примерно таким, как показано ниже, это полный путь к файлу модуля.
.../lib/XML/Simple.pm
Преимущество этого подхода по сравнению с вашим заключается в том, что если модуль установлен
вывод содержит путь к расположению модуля. Однако когда модуль не
установлено
или если у него нет perldoc, отображается сообщение об ошибке «Не найдена документация для ...» ,
что делает невозможным определить, связана ли ошибка с отсутствием модуля или отсутствием
документация. В таком сценарии становится удобной опция -m, поскольку она печатает весь
содержимое файла вместе с путем.
Самое короткое, что я знаю, не связано с псевдонимом скрипта или оболочки:
$ perl -MFoo::Bar\ 99
Foo::Bar version 99 required--this is only version 1.234.
(или обычным сообщением о том, что он не находится в @INC
, если он не установлен)
Для любопытных, это то же самое, что perl -e 'use Foo :: Bar 99'
.
Use pmvers
. Like the name suggests, it shows the version of an installed module. If a module is not installed, it fails with the familiar error message: Can't locate … in @INC (@INC contains: …)
Use pmpath
from the same distribution to find a module's installation path.
Утилита pmvers и другие pmtools сделают то, что вам нужно. В противном случае можно найти версию модуля в одну строку:
perl -le 'eval "require $ARGV[0]" and print $ARGV[0]->VERSION' Some::Module
Вот программа, которая делает это:
#!/usr/bin/perl
# testmod - test to see if a module is available
use strict;
use warnings;
my $mod = (shift @ARGV) || die "usage: $0 module\n";
# convert module-name to path
my $file = $mod;
$file =~ s{::}{/}gsmx;
$file .= '.pm';
# Pull in the module, if it exists
eval { require $file }
or die "can't find module $mod\n";
# Get the version from the module, if defined
my $ver;
{ no strict 'refs';
$ver = ${$mod . "::VERSION"} || 'UNKNOWN';
}
# And its location
my $from = $INC{$file};
print "module $mod is version $ver loaded from $from\n";