我正在编写一个小型的 Perl 脚本,它依赖于一些可能可用的模块,因此在安装过程中需要检查是否都已存在。我可以直接编写 use some::module
并查看是否出现错误,但对于最终用户来说,“您需要安装 some::module” 这样的简短信息会更有帮助。
我也可以搜索 @INC
中的每个目录,但由于这是 Perl,肯定要有更简单的方法。
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";
}
die "Some::Module missing!" unless(eval{require Some::Module});
我有一个小脚本,可以列出我系统上所有的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";
}
my $match;
if ($module =~ /$match/) {
print "Found $match: $module\n";
}
我使用类似这样的代码:
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
}
我喜欢使用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镜像。 :)