2009-04-29 201 views
10

我正在编写一个小的Perl脚本,它依赖于某些可能可用的模块,因此在安装过程中,我将不得不检查是否有所有的东西。我只能写use some::module,看看是否出现错误,但是像“你需要安装一些::模块”这样的短消息对于最终用户会更有帮助。如何检查Perl模块是否安装?

我也可以搜索@INC中的每个目录,但是因为它是Perl,所以必须有一个更简单的方法。

+1

如何检查是否安装了perl模块不是一个问题,它是一个声明。 – cjk 2009-04-29 12:27:08

回答

19
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"; 
} 
+1

这里需要注意的是,eval正在执行双重任务:它允许您检查任意模块,并且阻止使用语句变成BEGIN块。 Upshot是,如果您要编写像这样的代码,但为特定模块进行硬编码,则仍然使用基于字符串的eval。 – chaos 2009-04-29 19:09:14

+1

我喜欢你的答案,因为我想从bash中弄清楚这一点,但是,我遇到了模块需要参数的麻烦。例如[jens @ ca60c173(perl)p] $ perl -MPackage :: DeprecationManager -e';' 在导入Package :: DeprecationManager时,必须在-e行0处提供散列引用-deprecations参数。 – 2013-04-05 08:38:57

3

如何:

die "Some::Module missing!" unless(eval{require Some::Module}); 
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 f的形式

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 
} 
3

你是如何安装脚本的?如果您使用的是标准的Makefile.PL或Build.PL,则 列出的依赖关系是微不足道的。

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"; 
} 
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) 
    [email protected] 

这可能是一个有点慢,因为它必须连接到CPAN镜获取一些数据,但我也有一个地方CPAN镜像。 :)