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

时间:2008-09-22 15:15:51

标签: perl cpan

除了尝试

perldoc <module name>

单独为任何CPAN模块,我喜欢或通过文件系统并查看目录我不知道我们安装了什么模块。

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

30 个答案:

答案 0 :(得分:63)

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

您还可以在perlfaq3中找到常见问题条目"How do I find which modules are installed on my system?"。您可以通过查看perlfaq

查看所有常见问题解答答案的列表

答案 1 :(得分:33)

perldoc perllocal

编辑:CPAN FAQ

中有关于它的更多信息

答案 2 :(得分:24)

perldoc -q installed

声称cpan -l会做到这一点,但它对我不起作用。另一种选择:

cpan -a

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

答案 3 :(得分:23)

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

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

我相信brian d foy的backpan索引工作应该有代码将它传递给.pm文件,它会尝试推断分发,但即使这有时也会失败,因为包中的内容不一定是安装的(参见Devel ::封面::公司为例。

答案 4 :(得分:19)

您可以尝试ExtUtils-Installed,但这只会在.packlist中查找,因此可能会错过人们手动将内容移入@INC的模块。

我为一位想要在非shell网络托管帐户上以CGI脚本执行此操作的朋友写了App-Module-Lister。您可以简单地获取模块文件并将其作为文件名上传,服务器将其视为CGI脚本。它没有标准库之外的依赖项。按原样使用或窃取代码。

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

Tie::Cycle      1.15
Tie::IxHash     1.21
Tie::Toggle     1.07
Tie::ToObject   0.03
Time::CTime     99.062201
Time::DaysInMonth       99.1117
Time::Epoch     0.02
Time::Fuzzy     0.34
Time::JulianDay 2003.1125
Time::ParseDate 2006.0814
Time::Timezone  2006.0814

我一直想将此功能添加到cpan工具中,所以我也会这样做。 [时间的推移]而且,现在我在-l中进行了cpan切换。在我发布之前,我还有一些其他的事情要做,但it's in github。如果您不想等待,可以尝试-a开关来创建一个自动提示,尽管这会将一些Pod放在列表中。

祝你好运;

答案 5 :(得分:16)

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

答案 6 :(得分:10)

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

 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

答案 7 :(得分:9)

我喜欢使用CPAN'r'命令。您可以使用旧样式进入CPAN shell:

sudo perl -MCPAN -e shell

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

sudo cpan

(你通常必须使用'sudo'以root身份运行它,或者在运行它之前使用'su - '成为root用户,除非你设置cpan以让你以普通用户身份运行它,但安装如果你在这台机器上没有root,你仍然可以使用CPAN shell来查找这些信息,但你将无法安装模块,你可能需要经过一些设置第一次运行它。)

然后,一旦进入cpan shell,就可以使用'r'命令报告所有已安装的模块及其版本。所以,在“cpan&gt;”提示,输入'r'。这将列出所有已安装的模块及其版本。使用 '?'获得更多帮助。

答案 8 :(得分:6)

这是一个非常hacky方式在* nix中执行它,你会得到一些你并不真正关心的东西(例如:warnings :: register etc),但它应该给你一个每个.pm文件的列表可以通过perl访问。


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

答案 9 :(得分:6)

您可以在终端中使用instmodsh命令获取系统中安装的perl模块列表。它会询问您三个选项以增强它们的输出:

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

答案 10 :(得分:5)

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

答案 11 :(得分:2)

尝试以下命令

instmodsh

答案 12 :(得分:2)

尝试man perllocalperldoc perllocal

答案 13 :(得分:2)

答案可以在Perl FAQ list

中找到

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

perldoc perltoc

答案 14 :(得分:1)

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

Find installed Perl modules matching a regular expression

  • 便携式(仅使用核心模块)
  • 缓存选项,以便更快地查找
  • 可配置的显示选项

答案 15 :(得分:1)

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

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

确保安装了Data :: Dumper。

答案 16 :(得分:1)

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

调用脚本
perl perlmod.pl

OR

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

到目前为止,脚本会跳过当前目录('。'),因为我遇到了递归软链接的问题,但你可以通过更改第17行中的grep函数来包含它

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

到了,

@INC

可以找到脚本here.

答案 17 :(得分: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的头等大事!)

答案 18 :(得分:1)

要在不使用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}++;
    }
}

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

答案 19 :(得分:1)

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

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

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

答案 20 :(得分:0)

这是@ JamesThomasMoon1979编写的脚本,被重写为单行格式

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

答案 21 :(得分:0)

尝试“ perldoc -l”:

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

答案 22 :(得分:0)

以下对我有用。

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

答案 23 :(得分:0)

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

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

答案 24 :(得分:0)

Perl cookbook包含几个迭代的脚本“pmdesc”,它可以满足您的需求。 谷歌搜索“Perl Cookbook pmdesc”,你会发现articles on other Q&A Sites,网上有几个代码清单,对解决方案的讨论,甚至是some refinements

答案 25 :(得分:-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

答案 26 :(得分:-1)

使用perldoc -q安装以获取更多信息 或者只需输入

perldoc <Module::Name>

答案 27 :(得分:-2)

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

dpkg -l | grep "perl"

答案 28 :(得分:-2)

这对我有用

perl -e 'print join("\n",@INC,"")'

答案 29 :(得分:-3)

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