我如何知道Perl模块是核心还是标准安装的一部分?

我如何检查Perl模块是否是核心的一部分 – 也就是说它是标准安装的一部分?

我在找:

  • 一个命令行命令:
  • 一个Perl子程序/函数在代码中检查

也许这个问题应该是:我怎么知道在一台机器上最初提供了什么模块与特定的 Perl安装? (实际上,现在被问到如何告诉在一台机器上最初提供了什么模块的Perl特定安装?

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

有了这些知识,如果我保留原始的安装程序映像/包或知道如何再次在网上得到确切的东西,那么我有一个可重复的Perl安装几台机器知道什么模块将出席,什么模块不会。

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

我希望能够在安装的机器上执行此操作 。 所以为此,我将依靠安装来以某种formslogging原来的内容。

我问了一个分拆的问题: 我怎么知道在一台机器上最初提供了什么模块的特定Perl安装? (我怎么知道在一台机器上最初提供了什么模块的Perl特定安装?)

来自Module :: CoreList模块的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 

真的没有“核心”这样的东西了。 过去有一个标准的Perl发行版,但很多人没有标准的Perl发行版。 操作系统发行版通过添加或删除模块,更改模块等对其进行修改。 你不能依靠标准的分配标准。 有些Linux发行版甚至不包含Perl文档作为基本Perl安装的一部分。

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

你可以检查perlmodlib里的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线程::共享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作为其真正的核心标准安装的一部分。

不包含这些项目的安装是非标准的。 是的,我明白从您的angular度来看,这似乎是学术性的,但您的供应商的包装允许一个非标准的安装,打破否则工作的程序。

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

  $ apt-get --install-recommends安装perl 

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

你可以使用(例如,searchNet::FTP ):

 perl -MNet::FTP -e 1 

如果没有输出,则安装。

其他资源

 perldoc perlmodlib perldoc perllocal 

来自perlmonks的节点

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

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

作为一个例子,看看这个输出:

 dpkg-query -L perl | less 

您显然需要parsing输出,但是这恰恰是因为它特定于所涉及的机器而引起的。

  • 从命令行:

    假设你想知道是否安装了Tie::Hash模块。
    为了找出问题,从命令行执行以下命令:

     perl -MTie::Hash -e 1 

    如果你没有从上面的命令得到任何输出,那么模块被安装; 如果你得到一个错误,它没有安装。

  • 为了从脚本中进行检查,可以使用Module :: Load :: Conditional 。