我如何知道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 。