如何检查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的模块?)
答案 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
答案 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
你显然需要解析输出,但它确实是一个开始,因为 特定于相关机器。