97

除了尝试

perldoc <module name>

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

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

4

29 回答 29

71

这在 Perl FAQ 中得到了解答,可以通过perldoc -q installed. 简而言之,它归结为 usingExtUtils::Installed或 using File::Find,这两者的变体都已在本线程之前介绍过。

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

于 2008-09-23T02:58:02.583 回答
37
perldoc perllocal

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

于 2008-09-22T15:17:44.357 回答
30

perldoc -q installed

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

cpan -a

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

于 2013-03-01T20:32:00.997 回答
24

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

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

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

于 2008-09-22T16:26:30.463 回答
23
$ 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"
于 2015-06-05T16:39:13.390 回答
20

您可以尝试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
时间::JulianDay 2003.1125
时间::解析日期 2006.0814
时间::时区 2006.0814

我一直想把它作为一个功能添加到cpan工具中,所以我也会这样做。[时间流逝]而且,现在我有一个-l开关cpan。在发布之前,我还有其他一些事情要做,但它在 github 中。如果您不想等待,您可以尝试使用-a开关来创建自动捆绑包,尽管这会将一些 Pod 放在列表中。

祝你好运;

于 2008-09-22T20:25:09.377 回答
14

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

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
于 2011-04-07T07:27:11.997 回答
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”。这将列出所有已安装的模块及其版本。采用 '?' 获得更多帮助。

于 2008-09-22T15:34:40.340 回答
8
perl -MFile::Find=find -MFile::Spec::Functions -Tlwe 'find { wanted => sub { print canonpath $_ if /\.pm\z/ }, no_chdir => 1 }, @INC'
于 2013-01-30T08:13:34.920 回答
8

在 Linux/Unix 上,我使用这个简单的命令:

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

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

于 2018-09-29T07:38:48.807 回答
7

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

于 2008-09-22T16:08:06.827 回答
7

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

   l            - List all installed modules
   m <module>   - Select a module
   q            - Quit the program
于 2013-11-14T11:52:19.253 回答
5

试试下面的命令

安装程序

于 2013-01-30T06:59:23.747 回答
3

所有无法安装 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*** 几乎总是谷歌的热门!)

于 2019-09-26T10:05:09.003 回答
3

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

perl -MExtUtils::Installed -e '$i=ExtUtils::Installed->new(); 
      print "$_ ".$i->version($_)."\n" for $i->modules();'
于 2020-10-12T02:06:05.427 回答
2

答案可以在Perl FAQ 列表中找到。

你应该浏览一下 Perl 附带的优秀文档

perldoc perltoc
于 2009-05-31T02:00:12.520 回答
2

尝试man perllocalperldoc perllocal

于 2009-06-01T10:28:36.650 回答
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}++;
    }
}

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

于 2008-09-22T21:31:09.530 回答
1

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

perl perlmod.pl

或者

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

截至目前,脚本跳过当前目录('.'),因为我在递归软链接方面遇到问题,但您可以通过将第 17 行中的 grep 函数从

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

只是,

@INC

可以在此处找到该脚本。

于 2009-05-31T03:49:32.753 回答
1

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

查找与正则表达式匹配的已安装 Perl 模块

  • 便携(仅使用核心模块)
  • 用于更快查找的缓存选项
  • 可配置的显示选项
于 2009-11-14T03:02:45.683 回答
1

以下对我有用。

$ perldoc perllocal | grep Module
$ perldoc perllocal | grep -E 'VERSION|Module'
于 2017-06-22T20:54:03.697 回答
0

Perl 食谱包含脚本“pmdesc”的多次迭代,可以满足您的需求。谷歌搜索“Perl Cookbook pmdesc”,你会发现其他问答网站上的文章、网上的一些代码清单、解决方案的讨论,甚至一些改进

于 2011-05-26T22:42:14.010 回答
0

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

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

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

于 2011-08-18T19:18:07.453 回答
0
cd /the/lib/dir/of/your/perl/installation
perldoc $(find . -name perllocal.pod)

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

于 2014-02-20T20:19:57.367 回答
0

试试“perldoc -l”:

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

于 2019-09-11T08:35:04.510 回答
-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
于 2017-08-19T22:12:45.893 回答
-2

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

dpkg -l | grep "perl"
于 2017-11-08T07:24:06.247 回答
-2

这对我有用

perl -e 'print join("\n",@INC,"")'
于 2018-05-09T16:43:14.427 回答
-3

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

于 2013-04-23T14:57:06.313 回答