如何判断Perl模块是核心还是标准安装的一部分?

时间:2010-01-12 14:44:37

标签: perl module standard-library

如何检查Perl模块是否属于核心部分 - 即它是标准安装的一部分?

我正在寻找:

  • 命令行命令:
  • 用于在代码中检查的Perl子例程/函数

也许问题应该是:如何判断机器上特定 Perl安装最初提供的模块? (实际上,它现在被称为 How can I tell what modules were originally provided with the specific Perl installation on a machine? 。)

鉴于现在似乎没有一个整体的Perl标准安装,至少这个新问题的答案将告诉我最初在安装时的安装。

有了这些知识,如果我保留原始的安装程序映像/包或者知道如何在线再次获取确切的东西,那么我有几个机器的可重复Perl安装,知道将出现哪些模块以及将使用哪些模块不。

进一步说明:我正在查看最初安装的来自,作为该安装的一部分提供了哪些模块,以及内置的内容。 从那以后安装了什么。

我希望能够在具有安装的计算机上执行此操作。因此,我将依靠安装以某种形式记录它最初的内容。

我问分拆问题: How can I tell what modules were originally provided with the specific Perl installation on a machine? (如何判断最初在计算机上安装特定Perl的模块?)

7 个答案:

答案 0 :(得分:60)

来自corelist模块的Module::CoreList命令将确定模块是否为Core。

> corelist Carp

Carp was first release with perl 5

> corelist XML::Twig

XML::Twig was not in CORE (or so I think)

这是在脚本中使用它的一种方法。 Module::CoreList POD太简洁了 - 您必须查看源代码以找到要调用的方法:

use strict;
use warnings;
use Module::CoreList;

my $mod = 'Carp';
#my $mod = 'XML::Twig';
my @ms = Module::CoreList->find_modules(qr/^$mod$/);
if (@ms) {
    print "$mod in core\n";
}
else {
    print "$mod not in core\n";
}

__END__

Carp in core

答案 1 :(得分:8)

再也没有“核心”这样的东西了。曾经有一个标准的Perl发行版,但很多人没有标准的Perl发行版。操作系统分发通过添加或删除模块,更改模块等来修改它。您不能依赖标准分布实际上是标准的。某些Linux发行版甚至不包含Perl文档作为Perl基本安装的一部分。

您提到您不能使用Module::CoreList,因为它不是核心,但如果您可以创建文件,则可以安装该模块。你甚至可以假装自己写了它。

答案 2 :(得分:7)

您可以在子资料中查看perlmodlib

my %_stdmod;
sub is_standard_module {
  my($module) = @_;

  unless (keys %_stdmod) {
    chomp(my $perlmodlib = `perldoc -l perlmodlib`);
    die "cannot locate perlmodlib\n" unless $perlmodlib;

    open my $fh, "<", $perlmodlib
      or die "$0: open $perlmodlib: $!\n";

    while (<$fh>) {
      next unless /^=head\d\s+Pragmatic\s+Modules/ ..
                  /^=head\d\s+CPAN/;

      if (/^=item\s+(\w+(::\w+)*)/) {
        ++$_stdmod{ lc $1 };
      }
    }
  }

  exists $_stdmod{ lc $module } ? $module : ();
}

使用示例:

die "Usage: $0 module..\n" unless @ARGV;

foreach my $mod (@ARGV) {
  my $stdmod = is_standard_module $mod;
  print "$0: $mod is ", ($stdmod ? "" : "not "), "standard\n";
}

输出:

$ ./isstdmod threads::shared AnyDBM_File CGI LWP::Simple
./isstdmod: threads::shared is standard
./isstdmod: AnyDBM_File is standard
./isstdmod: CGI is standard
./isstdmod: LWP::Simple is not standard

perldoc绝对是Perl真正核心和标准安装的一部分。例如,perl-5.10.1的源代码分发包含

  • perldoc.PL,生成perldoc作为标准安装的一部分
  • perlmodlib.PL,生成perlmodlib.pod作为标准安装的一部分

这不是新增内容。大约有十年历史的Perl-5.6.0作为其真核标准安装的一部分perlmodlib

不包含这些项目的安装是非标准的。是的,我很欣赏从您的角度来看,它似乎是学术性的,但您的供应商的包装允许非标准安装,否则会破坏其他工作程序。

使用Debian的软件包管理器,您可以使用

获得标准的Perl安装
$ apt-get --install-recommends install perl

答案 3 :(得分:3)

对于真正懒惰的人来说,perldoc.perl.org网站上有Core Modules list

答案 4 :(得分:1)

您可以使用(例如,搜索Net::FTP):

perl -MNet::FTP -e 1

如果没有输出,则安装它。

其他资源

perldoc perlmodlib 
perldoc perllocal

A node from perlmonks

答案 5 :(得分:0)

  • 从命令行:

    让我们说你想知道 模块Tie::Hash是否是 安装。
    要找出,执行 以下命令行:

    perl -MTie::Hash -e 1
    

    如果您没有从上面的命令获得任何输出,则安装该模块;如果您收到错误,则表示未安装。

  • 要从脚本中进行此检查,您可以使用Module::Load::Conditional

答案 6 :(得分:0)

在回应Gbacon的评论时,你说你希望答案是平台中立的。我不知道这样的解决方案,但我想知道它是否是正确的方法。

如果你的目标是找出特定的机器,我会使用平台附带的工具。在Debian上,包括dpkg(预先安装在任何Debian系统上)或apt-file(未预先安装)或其他APT工具。

举个例子,看一下这个输出:

dpkg-query -L perl | less

你显然需要解析输出,但它确实是一个开始,因为 特定于相关机器。