57

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

我在找:

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

也许问题应该是:我如何知道机器上的特定Perl 安装最初提供了哪些模块?(实际上,现在问的是如何知道机器上的特定 Perl 安装最初提供了哪些模块?。)

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

有了这些知识,如果我保留原始安装程序映像/包或知道如何再次在线获取确切的内容,那么我可以为多台机器进行可重复的 Perl 安装,并且知道哪些模块将存在,哪些模块将不存在。

进一步澄清:我正在查看最初安装的内容,作为该安装的一部分提供的模块以及内置的内容。不是从那以后安装的。

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

我问了一个衍生问题: 我如何知道机器上的特定 Perl 安装最初提供了哪些模块?(我如何知道机器上的特定 Perl 安装最初提供了哪些模块?)

4

7 回答 7

63

Module::CoreList模块中的corelist命令将确定模块是否为核心。

> corelist Carp

Carp was first release with perl 5

> corelist XML::Twig

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

这是在脚本中使用它的一种方法。POD 太简洁了Module::CoreList——你必须搜索源代码才能找到要调用的方法:

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
于 2010-01-12T14:54:43.383 回答
8

您可以签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 线程::shared AnyDBM_File CGI LWP::Simple
./isstdmod:threads::shared 是标准的
./isstdmod: AnyDBM_File 是标准的
./isstdmod:CGI 是标准的
./isstdmod: LWP::Simple 不是标准的

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

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

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

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

使用 Debian 的包管理器,您可以获得标准的 Perl 安装

$ apt-get --install-recommends 安装 perl
于 2010-01-12T15:40:32.567 回答
7

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

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

于 2010-01-13T14:21:44.297 回答
3

对于真正懒惰的人,perldoc.perl.org 网站上有核心模块列表。

于 2010-01-12T15:47:42.257 回答
2

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

perl -MNet::FTP -e 1

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

其他资源

perldoc perlmodlib 
perldoc perllocal

来自 perlmonks 的节点

于 2010-01-12T14:52:13.497 回答
0
  • 从命令行:

    假设您想知道是否Tie::Hash安装了模块。
    要找出答案,请从命令行执行以下命令:

    perl -MTie::Hash -e 1
    

    如果您没有从上述命令中获得任何输出,则说明该模块已安装;如果你得到一个错误,它没有安装。

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

于 2010-01-12T14:49:51.883 回答
0

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

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

举个例子,看看这个的输出:

dpkg-query -L perl | less

您显然需要解析输出,但正是因为它特定于所讨论的机器,所以它让我一开始就感到震惊。

于 2010-01-16T21:57:14.710 回答