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


88

除了尝试

perldoc <module name>

单独为需要花哨的CPAN模块或浏览文件系统并查看目录的CPAN模块我不知道我们安装了哪些模块。

获得安装的每个CPAN模块的大列表的最简单方法是什么?从命令行或其他方式。


我可以建议使用pmtools,尤其是接受正则表达式的pminst
lukmdo 2010年

perl-pmtools是适合您的好工具。
jaseywang

您是否想知道安装了哪些模块或安装了哪些发行版?
Tim Bunce 2013年

4
我发现cpan -l在Windows上对自己有用。
无效

1
这可能有用:instmodsh
Ravi

Answers:


65

这可以在Perl常见问题解答中找到,可以通过快速找到答案perldoc -q installed。简而言之,归结为使用ExtUtils::Installed或使用File::Find,这两个线程的变体已在本线程中进行了介绍。

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


36
这比OP要求的要多得多,实际上是无用的。
贾斯汀2014年

2
cpan -l正在对我从其运行的任何目录进行递归搜索。有什么方法可以从该命令行传递ExtUtils::Installed构造函数的skip_cwd选项吗?
马克·里德

10
常见问题解答说可以使用,cpan -l但在RHEL6上不起作用,并/usr/bin/cpan -l抛出错误Unknown option: l
Stefan Lasiewski '16

1
$ perldoc perllocal | grep模块$ perldoc perllocal | grep -E'VERSION |
Module'– caot

使用perldoc -t perllocal来获取纯文本输出,否则grep可能由于嵌入的ctrl字符而无法工作
user333869


26

perldoc -q installed

声称可以解决问题cpan -l,但是对我不起作用。另一个选择:

cpan -a

确实吐出了一个很好的已安装软件包列表,并且具有将它们写入文件的良好副作用。


2
作为记录,cpan -l可以使用(或者对我而言使用CPAN v2.05)。cpan -a确实更漂亮。
威廉·特雷尔

23

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

遗憾的是,该解决方案似乎是通过File :: Find或类似方法遍历@INC。但是,不仅可以找到模块,还可以找到发行版中的相关模块。例如,除了Test :: Harness的实际发行版名称外,它还会报告TAP :: Harness和TAP :: Parser(假设您具有版本3或更高版本)。您可能会将它们与分发名称匹配,并丢弃那些不匹配的名称,但是随后您可能会丢弃本地构建和安装的模块。

我相信brian d foy的backpan索引工作应该具有将代码提交给.pm文件的代码,并且它将尝试推断分布,但是即使这样也有时会失败,因为不一定安装了软件包中的内容(请参阅Devel :: Cover :: Inc为例)。


1
我认为我不需要为此掏出BackPAN目录枪。就像我用Test :: Prereq所做的那样,用它在02packages中发现的发行版将其折叠可能就足够了。这比仅列出模块文件还有些技巧,而目录还没有处理完。
brian d foy

2
通过基本测试(在我周围的一些目录中进行“ make -n安装”),任何基于MakeMaker的模块的“ make install”步骤都会更新perllocal。它并不特定于直接通过CPAN安装。
rjray

1
我认为Dist :: Surveyor仍然是回答“该库中安装了哪些发行版?”这一问题的最佳工具。有关更多详细信息,请参见此演示文稿git repo中有一个易于使用的fatpack版本。
Tim Bunce 2013年

20
$ 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"

2
这对于没有安装cpan的人来说效果很好。
pdwalker

答案确实被低估了。这也适用于RHEL发行版。
克里斯蒂娜

4
我得到了:No documentation found for "perllocal".
Luis A. Florit's

花了比我预期更长的时间(在我的机器上大约20秒左右),但是它运行得非常完美!好答案。
汉斯·戈德曼

19

您可以尝试ExtUtils-Installed,但只能在.packlists中查看,因此可能会错过人们@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。

祝好运;


12

这是一个可以解决问题的脚本:

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

在RHEL 6.9下,此脚本仅打印以下内容: Perl - 5.10.1 未列出模块。
汉斯·德拉贡

9

我喜欢为此使用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”。这将列出所有已安装的模块及其版本。使用 '?' 以获得更多帮助。


1
实际上,“ r”会为您提供重新安装建议-即您安装中的所有模块都具有较新版本的CPAN。除非您的安装非常陈旧,否则它不会是完整列表。
EvdB

我的“ r”总是报告几乎所有内容,因为我强迫升级。这让我想起了...我今天还没有升级。
skiphoppy

3
-r重新编译内容。要获取列表,请尝试-a或下载最新的资源并使用为该答案添加的新-l开关。:)
brian d foy

1
为什么在sudo这里?完全没有必要。
亚里斯多德·帕加尔兹

2
注意'cpan'的'-r'命令行参数和cpan shell中的'r'命令之间的区别:)
EvdB

7

这是在* 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;
    }
}


2
这不会给他他想要的东西。它不会根据相关文件的分发来对它们进行分组,它将列出Perl本身的所有核心* .pm文件。
rjray

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

这非常好,因为它清楚地显示了每个*.pm模块的完整路径。您可能会看到很多重复...
not2qubit

7

您可以通过instmodsh在终端中使用命令来获取系统中安装的perl模块的列表。它将要求您选择三个选项以增强输出:

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

5

在Linux / Unix上,我使用以下简单命令:

perl -e 'print qx/find $_ -name "*.pm"/ foreach ( @INC );' 

它扫描其中的所有文件夹@INC并查找任何* .pm文件。


谢谢!很有用。
not2qubit

谢谢!这也许是我用如此简洁的表达所学到的最高级的内容。
ewd




1

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

perl perlmod.pl

要么

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

到目前为止,由于我在递归软链接方面遇到问题,该脚本会跳过当前目录('。'),但您可以通过更改第17行中的grep函数从

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

只是,

@INC

脚本可以在这里找到



1

要遍历@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中给出)保存为键的值,而不是所看到的次数。


1

以下对我有用。

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

1

所有无法安装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的头号热门!)


这对我有用。感谢您发布此信息。我在没有太多权限安装/更新任何依赖项的环境中需要这样做。
Ashish Kumar


0

这是一个Perl线性代码,它将打印出已安装模块的列表:

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

只要确保您已安装Data :: Dumper。


2
这仅列出了大约15个perl模块,而不是“ cpan -l”列出的5945。
Paul Tomblin 2012年

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

Windows用户只需执行Windows资源管理器搜索即可找到它。


0

尝试“ perldoc -l”:

$ perldoc -l Log :: Dispatch /usr/local/share/perl/5.26.1/Log/Dispatch.pm


0

这是@ JamesThomasMoon1979撰写的脚本,被重写为单行

perl -MExtUtils::Installed -e '$i=ExtUtils::Installed->new(); 
      print "$_ ".$i->version($_)."\n" for $i->modules();'

-1

当您输入Perl脚本时,所有已安装的模块都以.pm文件的形式保存在@INC文件夹下,因此,一个小的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

为什么不?find `perl -le'print for@INC'` -name '*.pm'
海尼克

-2

对于Linux,最简单的获取方法是

dpkg -l | grep "perl"

1
OP要求提供系统中已安装的CPAN(perl)模块的列表,而不是系统中是否安装了perl(OP都没有告诉我们apt是否可用)
ROLO

我不是perl专家,但是我已经从上述命令中看到了安装的perl模块。可能不是这里的完美答案。
Yasiru G


-3

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


2
我不认为这可以回答问题。使用此建议,可能需要花费相当长的时间才能逐个模块地了解是否安装了哪些模块。
戴夫纽曼
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.