【问题标题】:How do I check whether a Perl module is installed? [duplicate]如何检查是否安装了 Perl 模块? [复制]
【发布时间】:2010-10-22 13:45:54
【问题描述】:

我正在编写一个小的 Perl 脚本,它依赖于一些可能可用的模块,因此在安装过程中我必须检查是否所有内容都在那里。我可以写use some::module 看看是否出现错误,但是像“你需要安装一些::模块”这样的短消息对最终用户更有帮助。

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

【问题讨论】:

  • 如何检查是否安装了 perl 模块不是问题,而是语句。

标签: perl module


【解决方案1】:
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";
}

【讨论】:

  • 在此要注意的是 eval 有双重职责:它允许您检查任意模块,并防止 use 语句变成 BEGIN 块。结果是,如果您要编写这样的代码但为特定模块硬编码,您仍然会使用基于字符串的 eval。
  • 我喜欢你的回答,因为我想从 bash 中解决这个问题,但是,我遇到了需要参数的模块。例如[jens@ca60c173 (perl) p]$ perl -MPackage::DeprecationManager -e ';'在 -e line 0 处导入 Package::DeprecationManager 时必须提供哈希引用 -deprecations 参数。
  • 快速评论,虽然这很好,但它不适用于内联模块。
【解决方案2】:

怎么样:

die "Some::Module missing!" unless(eval{require Some::Module});

【讨论】:

  • 如果要模拟使用,则需要调用 import 并在末尾添加一个是个好主意,因为 import 不需要返回真实值:eval{require Some::Module;一些::模块->导入; 1};如果模块本质上是词法的(如 autobox),这也是不够的,因为它将在 eval 中导入,然后在 eval 结束时超出范围。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      我使用这样的东西:

      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
      }
      

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 2012-03-09
          • 2021-01-04
          • 1970-01-01
          • 1970-01-01
          • 2010-11-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多