我正在编写一个小的Perl脚本,它依赖于一些可能的模块,因此在安装过程中我必须检查是否每个都有。我可以写use some::module
并查看是否出现错误,但是像“你需要安装一些:: module”这样的短消息会对最终用户更有帮助。
我也可以搜索@INC
中的每个目录,但是因为它是Perl,所以必须有一种更简单的方法。
答案 0 :(得分:19)
perl -MSome::Module -e ';'
哎呀,误读了这个问题。我以为你想知道一次性的事情,而不是以可恢复的方式发现它。我总是使用这样的东西:
sub try_load {
my $mod = shift;
eval("use $mod");
if ($@) {
#print "\$@ = $@\n";
return(0);
} else {
return(1);
}
}
您使用的是这样的:
$module = 'Some::Module';
if (try_load($module)) {
print "loaded\n";
} else {
print "not loaded\n";
}
答案 1 :(得分:3)
怎么样:
die "Some::Module missing!" unless(eval{require Some::Module});
答案 2 :(得分:3)
您是如何安装脚本的?如果您使用的是标准的Makefile.PL或Build.PL, 列出依赖关系是微不足道的。
答案 3 :(得分:2)
我有一个小脚本,列出了我系统上的所有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";
}
答案 4 :(得分:1)
我使用这样的东西:
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 shell函数的形式使用它:
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
}
答案 5 :(得分:1)
我喜欢使用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)
ingy@cpan.org
这可能有点慢,因为它必须连接到CPAN镜像以获取一些数据,但我还有一个本地CPAN镜像。 :)