我如何获得已安装的CPAN模块列表?

除了尝试

perldoc <module name> 

单独的任何CPAN模块,需要我的花哨或通过文件系统,看着目录我不知道我们已经安装了什么模块。

只需安装每个CPAN模块的清单,最简单的方法是什么? 从命令行或其他。

这在Perl常见问题解答中得到了解答, perldoc -q installed可以很快find答案。 简而言之,就是使用ExtUtils::Installed或者使用File::Find ,在这个线程中前面已经介绍了两种变体。

您也可以findFAQ条目“如何查找我的系统上安装了哪些模块? 在perlfaq3。 您可以通过查看perlfaq来查看所有常见问题解答的列表

 perldoc perllocal 

编辑:在CPAN常见问题解答中有关于它的更多信息

值得注意的是perldoc perllocal只会报告通过CPAN安装的模块。 如果有人手动安装模块,则不会find它们。 另外,如果你有多个人安装模块,并且perllocal.pod在源代码控制之下,那么人们可能会不正确地解决冲突并破坏列表(例如,这是在工作中发生的)。

令人遗憾的是,解决scheme似乎是通过@INC与File :: Find或类似的东西。 但是,这不仅仅是find模块,它也发现在一个分布的相关模块。 例如,除了Test :: Harness的实际分发名称(假设您的版本为3或更高版本)之外,它还会报告TAP :: Harness和TAP :: Parser。 您可能会将它们与分配名称匹配起来,并丢弃那些不匹配的名称,但是您可能会丢弃本地创build和安装的模块。

我相信brian d foy的后台索引工作应该有代码在.pm文件中提交,它会尝试推断分布,但是即使这样也会失败,因为包中的内容不一定需要安装(参见Devel :: Cover ::公司为例)。

你可以试试ExtUtils-Installed ,但是只能在.packlist查找,所以可能会错过人们用手把东西移动到@INC的模块。

我为一个朋友写了App-Module-Lister ,这个朋友想在一个非shell的虚拟主机账户上做这个CGI脚本。 您可以简单地将模块文件作为文件名上传,您的服务器将把它视为CGI脚本。 它在标准库之外没有依赖关系。 按原样使用或窃取代码。

它输出模块及其版本的列表:

 Tie :: Cycle 1.15
 Tie :: IxHash 1.21
 Tie :: Toggle 1.07
 Tie :: ToObject 0.03
 Time :: CTime 99.062201
时间:: DaysInMonth 99.1117
时间::时代0.02
时间::模糊0.34
时间:: JulianDay 2003.1125
 Time :: ParseDate 2006.0814
时间::时区2006.0814

我一直有意将这个function添加到cpan工具中,所以我也会这样做。 [时光stream逝]现在我有一个-l开关。 在发布之前,我还有其他一些事情要做,但是在github中 。 如果你不想等,那么你可以试试用-a开关来创build一个自动绑定,尽pipe这会把一些Pod放在列表中。

祝你好运;

perldoc -q installed

声称cpan -l会做的伎俩,但它不适合我。 另一种select:

cpan -a

会吐出一个安装的软件包的好名单,并有写入文件的好的副作用。

 $ for M in `perldoc -t perllocal|grep Module |sed -e 's/^.*" //'`; do V=`perldoc -t perllocal|awk "/$M/{y=1;next}y" |grep VERSION |head -n 1`; printf "%30s %s\n" "$M" "$V"; done |sort Class::Inspector * "VERSION: 1.28" Crypt::CBC * "VERSION: 2.33" Crypt::Rijndael * "VERSION: 1.11" Data::Dump * "VERSION: 1.22" DBD::Oracle * "VERSION: 1.68" DBI * "VERSION: 1.630" Digest::SHA * "VERSION: 5.92" ExtUtils::MakeMaker * "VERSION: 6.84" install * "VERSION: 6.84" IO::SessionData * "VERSION: 1.03" IO::Socket::SSL * "VERSION: 2.016" JSON * "VERSION: 2.90" MIME::Base64 * "VERSION: 3.14" MIME::Base64 * "VERSION: 3.14" Mozilla::CA * "VERSION: 20141217" Net::SSLeay * "VERSION: 1.68" parent * "VERSION: 0.228" REST::Client * "VERSION: 271" SOAP::Lite * "VERSION: 1.08" Task::Weaken * "VERSION: 1.04" Term::ReadKey * "VERSION: 2.31" Test::Manifest * "VERSION: 1.23" Test::Simple * "VERSION: 1.001002" Text::CSV_XS * "VERSION: 1.16" Try::Tiny * "VERSION: 0.22" XML::LibXML * "VERSION: 2.0108" XML::NamespaceSupport * "VERSION: 1.11" XML::SAX::Base * "VERSION: 1.08" 

我喜欢使用CPAN'r'命令。 你可以用旧的风格进入CPAN shell:

 sudo perl -MCPAN -e shell 

或者,在大多数较新的系统中,有一个'cpan'命令,所以这个命令会让你到shell:

 sudo cpan 

(通常必须使用'sudo'作为root用户运行它,或者在运行之前使用'su – '来成为root用户,除非你设置了cpan作为普通用户运行它,但是以root身份安装。如果您的计算机上没有root用户,仍然可以使用CPAN shell来查找这些信息,但是您将无法安装模块,并且您可能必须在第一时间通过一些设置运行。)

然后,一旦你在cpan shell中,你可以使用'r'命令报告所有已安装的模块及其版本。 所以,在“cpan>”提示符处,input“r”。 这将列出所有已安装的模块及其版本。 使用 '?' 得到一些更多的帮助。

这里有一个脚本可以做到这一点:

  use ExtUtils::Installed; my $inst = ExtUtils::Installed->new(); my @modules = $inst->modules(); foreach $module (@modules){ print $module ." - ". $inst->version($module). "\n"; } =head1 ABOUT This scripts lists installed cpan modules using the ExtUtils modules =head1 FORMAT Prints each module in the following format <name> - <version> =cut 

这是一个非常冒险的方法,在* nix中,你会得到一些你不太关心的东西(即:warnings :: register等),但它应该给你一个每个.pm文件的列表,可以通过perl的。

for my $path (@INC) { my @list = `ls -R $path/**/*.pm`; for (@list) { s/$path\///g; s/\//::/g; s/\.pm$//g; print; } }
for my $path (@INC) { my @list = `ls -R $path/**/*.pm`; for (@list) { s/$path\///g; s/\//::/g; s/\.pm$//g; print; } } 

你可以通过在terminal上使用instmodsh命令来获得安装在你的系统上的perl模块列表。为了增强它们的输出,它会问你三个选项:

  l - List all installed modules m <module> - Select a module q - Quit the program 

答案可以在Perl FAQ列表中find 。

您应该浏览Perl附带的优秀文档

 perldoc perltoc 

这是一个Perl单行程序,将打印出已安装模块的列表:

 perl -MExtUtils::Installed -MData::Dumper -e 'my ($inst) = ExtUtils::Installed->new(); print Dumper($inst->modules());' 

只要确保你已经安装了Data :: Dumper。

尝试下面的命令

instmodsh

 perl -MFile::Find=find -MFile::Spec::Functions -Tlwe 'find { wanted => sub { print canonpath $_ if /\.pm\z/ }, no_chdir => 1 }, @INC' 

我昨天写了一个perl脚本来做这个。 该脚本使用'::'作为分隔符返回安装在@INC中的perl模块的列表。 调用脚本使用 –

 perl perlmod.pl 

要么

 perl perlmod.pl <module name> #Case-insensitive(eg. perl perlmod.pl ftp) 

到目前为止,脚本跳过当前目录('。'),因为我在recursion软链接时遇到了问题,但是可以通过将第17行中的grep函数从

  grep { $_ !~ '^\.$' } @INC 

只是,

 @INC 

脚本可以在这里find。

试试man perllocalperldoc perllocal

这里还有一个命令行工具来列出所有已安装的.pm文件:

find与正则expression式匹配的已安装Perl模块

  • 便携式(仅使用核心模块)
  • 高速caching选项,以加快查找速度
  • 可configuration的显示选项

我可以build议使用pmtools ,尤其是接受正则expression式的pminst 。

perl-pmtools是你的好工具。

为了在不使用ls(1)这样的外部程序的情况下遍历@INC目录树,可以使用File::Find::Rule模块,它有一个很好的声明性接口。

另外,如果以前的Perl版本包含相同的模块,则需要过滤掉重复项。 执行此操作的代码如下所示:

 #! /usr/bin/perl -l use strict; use warnings; use File::Find::Rule; my %seen; for my $path (@INC) { for my $file (File::Find::Rule->name('*.pm')->in($path)) { my $module = substr($file, length($path)+1); $module =~ s/.pm$//; $module =~ s{[\\/]}{::}g; print $module unless $seen{$module}++; } } 

在运行结束时,您还可以将所有模块名称作为%看到哈希中的键。 代码可以被调整为将规范文件名(在$ file中给出)保存为密钥的值,而不是所看到的次数。

Perl cookbook包含了几个你想要的脚本“pmdesc”的迭代。 谷歌search“Perl Cookbook pmdesc”,你会发现在其他问答网站上的文章 ,在网上的几个代码清单,对解决scheme的讨论,甚至一些改进 。

 cd /the/lib/dir/of/your/perl/installation perldoc $(find . -name perllocal.pod) 

Windows用户只需进行Windows资源pipe理器search即可find它。

以下为我工作。

 $ perldoc perllocal | grep Module $ perldoc perllocal | grep -E 'VERSION|Module' 

当你input你的Perl脚本时,你将所有已安装的模块作为@INC文件夹下的.pm文件,所以一个小的bash脚本将为你完成这个工作:

 #!/bin/bash echo -e -n "Content-type: text/plain\n\n" inc=`perl -e '$, = "\n"; print @INC;'` for d in $inc do find $d -name '*.pm' done 

对于Linux来说,最简单的方法是,

 dpkg -l | grep "perl" 

使用perldoc -q安装更多的信息或只需键入

 perldoc <Module::Name> 

这就是我所做的: perl -M{cpan_module}
如果您没有收到任何错误,则很可能安装了该模块。