如何检查是否安装了Perl模块?

如何检查是否安装了Perl模块?,perl,module,Perl,Module,我正在编写一个小的Perl脚本,它依赖于一些可能可用的模块,因此在安装过程中,我必须检查是否存在任何问题。我可以编写使用some::module并查看是否出现错误,但是像“您需要安装some::module”这样的短消息对最终用户更有用 我也可以搜索@INC中的每个目录,但由于它是Perl,所以必须有一种更简单的方法 perl -MSome::Module -e ';' 哎呀,误读了这个问题。我以为你只想知道一次,而不是以可恢复的方式发现它。我总是这样用: sub try_load { m

我正在编写一个小的Perl脚本,它依赖于一些可能可用的模块,因此在安装过程中,我必须检查是否存在任何问题。我可以编写
使用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";
}
您可以这样使用:

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});

我用这样的方式:

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
}
函数wherperl
{

perl-M$1如何安装脚本?如果您使用的是标准Makefile.PL或Build.PL,
列出依赖项很简单。

我有一个小脚本,它列出了我系统上的所有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";
}

我喜欢使用
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镜像。:)

如何检查是否安装了perl模块不是一个问题,而是一条语句。如果要模拟使用,则需要调用import,并且在最后添加一个是一个好主意,因为不需要导入要返回真值:eval{require Some::Module;Some::Module->import;1};如果模块本质上是词法的(如autobox),这也不够因为它将在eval中导入,然后在eval结束时超出范围。请注意,eval具有双重功能:它允许您检查任意模块,并防止use语句变成BEGIN块。结果是,如果您编写这样的代码,但对特定模块进行硬编码,则仍然使用基于字符串的求值。我喜欢你的答案,因为我想从bash中找到答案,但是,我遇到了需要参数的模块的麻烦[jens@ca60c173(perl)p]$perl-MPackage::DeprecationManager-e';'在-e行0导入Package::DeprecationManager时,必须提供一个hash reference-deprecations参数。