除了尝试
perldoc <module name>
单独为需要花哨的CPAN模块或浏览文件系统并查看目录的CPAN模块我不知道我们安装了哪些模块。
获得安装的每个CPAN模块的大列表的最简单方法是什么?从命令行或其他方式。
除了尝试
perldoc <module name>
单独为需要花哨的CPAN模块或浏览文件系统并查看目录的CPAN模块我不知道我们安装了哪些模块。
获得安装的每个CPAN模块的大列表的最简单方法是什么?从命令行或其他方式。
cpan -l
在Windows上对自己有用。
instmodsh
Answers:
这可以在Perl常见问题解答中找到,可以通过快速找到答案perldoc -q installed
。简而言之,归结为使用ExtUtils::Installed
或使用File::Find
,这两个线程的变体已在本线程中进行了介绍。
您还可以找到FAQ条目“如何查找系统上安装了哪些模块?”。在perlfaq3中。您可以通过查看perlfaq来查看所有常见问题解答的列表。
ExtUtils::Installed
构造函数的skip_cwd
选项吗?
cpan -l
但在RHEL6上不起作用,并/usr/bin/cpan -l
抛出错误Unknown option: l
。
perldoc perllocal
编辑:在CPAN常见问题解答中有(更多)关于此的更多信息
值得注意的是,perldoc perllocal将仅报告通过CPAN安装的模块。如果有人手动安装模块,它将找不到它们。另外,如果您有多个人安装模块,并且perllocal.pod在源代码控制下,则人可能会错误地解决冲突并破坏列表(例如,这是在工作中发生的)。
遗憾的是,该解决方案似乎是通过File :: Find或类似方法遍历@INC。但是,不仅可以找到模块,还可以找到发行版中的相关模块。例如,除了Test :: Harness的实际发行版名称外,它还会报告TAP :: Harness和TAP :: Parser(假设您具有版本3或更高版本)。您可能会将它们与分发名称匹配,并丢弃那些不匹配的名称,但是随后您可能会丢弃本地构建和安装的模块。
我相信brian d foy的backpan索引工作应该具有将代码提交给.pm文件的代码,并且它将尝试推断分布,但是即使这样也有时会失败,因为不一定安装了软件包中的内容(请参阅Devel :: Cover :: Inc为例)。
$ 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"
No documentation found for "perllocal".
您可以尝试ExtUtils-Installed,但只能在.packlist
s中查看,因此可能会错过人们@INC
手动将东西移入的模块。
我为一个想在非Shell虚拟主机帐户上作为CGI脚本执行此操作的朋友编写了App-Module-Lister。您只需获取模块文件,然后将其作为文件名上传,服务器会将其视为CGI脚本。它在标准库之外没有任何依赖项。照常使用它或窃取代码。
它输出模块及其版本的列表:
并列::周期1.15 领带:: IxHash 1.21 领带::切换1.07 领带:: ToObject 0.03 时间:: CTime 99.062201 时间:: DaysInMonth 99.1117 时间::时代0.02 时间::模糊0.34 时间::朱利安日2003.1125 时间::解析日期2006.0814 时间::时区2006.0814
我一直想将其作为功能添加到cpan
工具中,因此我也会这样做。[时间流逝]而且,现在我有一个-l
开关cpan
。在发布之前,我还有其他事情要做,但是它在github中。如果您不想等待,可以尝试使用-a
开关来创建自动捆绑包,尽管这会在列表中添加一些Pod。
祝好运;
这是一个可以解决问题的脚本:
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
Perl - 5.10.1
未列出模块。
我喜欢为此使用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>”提示符下,键入“ r”。这将列出所有已安装的模块及其版本。使用 '?' 以获得更多帮助。
sudo
这里?完全没有必要。
这是在* nix中实现的一种非常hacky的方式,您会得到一些您并不真正关心的东西(例如: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;
}
}
要遍历@INC目录树而不使用ls(1)之类的外部程序,可以使用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}++;
}
}
运行结束时,您还将所有模块名称作为%seen哈希中的键。该代码可适用于将规范文件名(在$ file中给出)保存为键的值,而不是所看到的次数。
所有无法安装perldoc或其他模块,并且想知道可用模块(CPAN或其他)的用户,以下适用于linux和Mingw32 / 64:
grep -RhIP '^package [A-Z][\w:]+;' `perl -e 'print join " ",@INC'` | sed 's/package //' | sort | uniq
是的,很乱。是的,它的报告可能比您想要的要多。但是,如果将其通过管道传输到文件中,则可以轻松地检查例如存在哪些dbm接口:
grep -RhIP '^package [A-Z][\w:]+;' `perl -e 'print join " ",@INC'` | sed 's/package //' | sort | uniq > modules-installed
cat modules-installed | grep -i dbm
AnyDBM_File;
Memoize::AnyDBM_File;
Memoize::NDBM_File;
Memoize::SDBM_File;
WWW::RobotRules::AnyDBM_File;
这就是为什么我最终看到此页面的原因(失望)
(我意识到这并不能完全回答OP的问题,但是我会将其发布给出于相同原因而最终来到这里的任何人。这就是堆栈问题***几乎不可能找到您要解决的问题问,即使它存在,但是stack ***几乎总是Google的头号热门!)
Perl Cookbook包含脚本“ pmdesc”的多次迭代,可以完成您想要的操作。Google搜索“ Perl Cookbook pmdesc”,您会发现在其他问答网站上文章,在网上一些代码清单,对该解决方案进行讨论,甚至进行一些改进。
这是一个Perl线性代码,它将打印出已安装模块的列表:
perl -MExtUtils::Installed -MData::Dumper -e 'my ($inst) = ExtUtils::Installed->new(); print Dumper($inst->modules());'
只要确保您已安装Data :: Dumper。
这对我有用
perl -e 'print join("\n",@INC,"")'