インストールされているCPANモジュールのリストを取得するにはどうすればよいですか?


88

試してみる以外に

perldoc <module name>

個別に、またはファイルシステムを調べてディレクトリを確認するCPANモジュールについては、どのモジュールをインストールしたかわかりません。

インストールされているすべてのCPANモジュールの大きなリストを取得する最も簡単な方法は何ですか?コマンドラインまたはその他から。


pmtools、特に正規表現を受け入れるpminstの使用を提案できます。
lukmdo 2010

perl-pmtoolsはあなたにとって良いツールです。
jaseywang 2012

インストールされているモジュール、またはインストールされているディストリビューションを知りたいですか?
ティム・バンス2013

4
cpan -lは窓の上で自分自身に役立つことがわかりました。
無効

1
これは便利かもしれません:instmodsh
ラヴィ

回答:


65

これは、Perl FAQで回答されていperldoc -q installedます。この回答は、ですばやく見つけることができます。要するに、それは、このスレッドで以前にカバーされた両方のバリアントを使用ExtUtils::Installedまたは使用File::Findすることになります。

また、FAQエントリ「システムにインストールされているモジュールを見つけるにはどうすればよいですか?」もあります。perlfaq3で。perlfaqを調べると、すべてのFAQ回答のリストを確認できます。


36
これは、OPが要求したよりもはるかに多くを提供するため、事実上役に立たない。
ジャスティン

2
cpan -lは、実行元のディレクトリを再帰的に検索します。そのコマンドラインからExtUtils::Installedコンストラクターのskip_cwdオプションを渡す方法はありますか?
マークリード

10
FAQは使用するように言っていますcpan -lが、それはRHEL6では機能せず/usr/bin/cpan -l、エラーをスローしますUnknown option: l
Stefan Lasiewski 2016年

1
$ perldoc perllocal | grepモジュール$ perldoc perllocal | grep
-E'VERSION

perldoc -t perllocalを使用してプレーンテキスト出力を取得します。そうしないと、Ctrl文字が埋め込まれているためにgrepが機能しない場合があります
user333869 2017年

35
perldoc perllocal

編集:CPAN FAQにそれについての(少し)より多くの情報があります


2
FAQへのリンクをありがとう。残念ながら、私が知っているすべてのモジュールがインストールされているわけではありません。Date :: Calcはそこにも表示されません。
David McLaughlin

26

perldoc -q installed

cpan -lトリックを行うと主張しますが、それは私にとってはうまくいきません。他のオプション:

cpan -a

インストールされているパッケージの素晴らしいリストを吐き出し、それらをファイルに書き込むという素晴らしい副作用があります。


2
記録のために、cpan -l動作します(またはCPAN v2.05で動作します)。cpan -a確かにきれいです。
ウィリアムタレル2014

23

perldoc perllocalは、CPANを介してインストールされたモジュールについてのみレポートすることに注意してください。誰かがモジュールを手動でインストールした場合、それらは見つかりません。また、複数の人がモジュールをインストールしていて、perllocal.podがソース管理下にある場合、人が競合を誤って解決し、リストを破損する可能性があります(これは、たとえば、ここで発生しています)。

残念ながら、解決策はFile :: Findまたは同様のものを使用して@INCをウォークスルーしているようです。ただし、これはモジュールを見つけるだけでなく、ディストリビューション内の関連モジュールも見つけます。たとえば、Test :: Harnessの実際の配布名に加えて、TAP :: HarnessとTAP :: Parserが報告されます(バージョン3以降を使用している場合)。それらをディストリビューション名と一致させ、一致しない名前を破棄する可能性がありますが、ローカルで構築およびインストールされたモジュールを破棄する可能性があります。

brian d foyのバックパンインデックス作成作業には、.pmファイルでそれを渡すコードが含まれているはずであり、ディストリビューションを推測しようとしますが、パッケージに含まれているものが必ずしもインストールされていないため、これでも失敗することがあります(Devel :: Coverを参照)。 :: Inc)。


1
そのためにBackPANカタログガンを引き出す必要はないと思います。Test :: Prereqで行うようなことで、02packagesで見つかったディストリビューションで折りたたむだけで十分かもしれません。ただし、これはモジュールファイルを一覧表示するよりも少し注意が必要であり、カタログはまだそれを処理するのに近づいていません。
brian d foy 2008

2
初歩的なテスト(私が置いているいくつかのdirで「make-n install」を実行する)から、MakeMakerベースのモジュールの「makeinstall」ステップはperllocalを更新します。CPANを介して直接インストールすることに固有のものではありません。
rjray 2008

1
Dist :: Surveyorは、「そのライブラリにインストールされているディストリビューションは何か」という質問に答えるのに最適なツールだと思います。詳細については、このプレゼンテーションを参照してください。gitリポジトリには使いやすいfatpackedバージョンがあります。
ティム・バンス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 2016

本当に過小評価された答え。これはRHELディストリビューションでも機能します。
クリスティーナ2016

4
私が得たもの:No documentation found for "perllocal".
ルイスA.フロリット2017年

予想よりも実行に時間がかかりましたが(私のマシンでは約20秒)、問題なく動作しました。素晴らしい答え。
ハンスゴールドマン

19

ExtUtils-Installedを試すことができますが.packlist、それはsでしか見えないため、人々が物を移動したモジュールを見逃す可能性があります@INC手で。

私が書いたのApp-モジュール-リスターを非シェルのWebホスティングアカウントのCGIスクリプトとしてこれをやってみたかった友人のために。モジュールファイルを取得して、サーバーがCGIスクリプトとして扱うファイル名としてアップロードするだけです。標準ライブラリ以外の依存関係はありません。そのまま使用するか、コードを盗んでください。

モジュールとそのバージョンのリストを出力します。

Tie ::サイクル1.15
Tie :: IxHash 1.21
Tie :: Toggle 1.07
Tie :: ToObject 0.03
時間:: CTime 99.062201
Time :: DaysInMonth 99.1117
時間:: Epoch 0.02
時間::ファジー0.34
時間::ユリウス日2003.1125
Time :: ParseDate 2006.0814
時間::タイムゾーン2006.0814

これを機能としてcpanツールに追加するつもりだったので、それも行います。[時間が経ちます]そして、今、私は-lスイッチを持っていcpanます。リリースする前に、他にもいくつか関係がありますが、githubにあります。それを待ちたくない場合は、-aスイッチを試して自動バンドルを作成することもできますが、それによってポッドがリストに追加されます。

幸運を;


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シェルに入ることができます:

sudo perl -MCPAN -e shell

または、ほとんどの新しいシステムでは、「cpan」コマンドがあるため、このコマンドでシェルに移動します。

sudo cpan

(通常のユーザーとして実行できるようにcpanを設定していない限り、通常は「sudo」を使用してrootとして実行するか、「su-」を使用してrootになりますが、rootとしてインストールします。このマシンにrootがない場合でも、CPANシェルを使用してこの情報を見つけることができますが、モジュールをインストールすることはできず、最初に少しセットアップを行う必要がある場合があります。それを実行します。)

次に、cpanシェルに入ったら、「r」コマンドを使用して、インストールされているすべてのモジュールとそのバージョンを報告できます。したがって、「cpan>」プロンプトで「r」と入力します。これにより、インストールされているすべてのモジュールとそのバージョンが一覧表示されます。使用する '?' さらに助けを得る。


1
実際には、「r」は再インストールの推奨事項を示します。つまり、新しいバージョンのCPANを持つインストール上のすべてのモジュールです。インストールが非常に古くなっていない限り、これは完全なリストにはなりません。
evdB 2008

私は強制的にアップグレードするので、私の「r」は常にほとんど何も報告しません。それは私に思い出させます...私は今日まだアップグレードしていません。
skiphoppy 2008

3
-rはものを再コンパイルします。リストを取得するには、-aを試すか、最新のソースをダウンロードして、この回答のために追加された新しい-lスイッチを試してみてください。:)
brian d foy 2008

1
なぜsudoここに?それは完全に不要です。
アリストテレスパガルツィス2008

2
'cpan'に対する '-r'コマンドライン引数とcpanシェルの 'r'コマンドの違いに注意してください:)
EvdB 2008

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;
    }
}


2
これは彼が望むものを彼に与えません。関連ファイルをそれらが含まれるディストリビューションごとにグループ化することはなく、Perl自体からのすべてのコア* .pmファイルをリストします。
rjray 2008

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モジュールのリストを取得できます。出力を拡張するために3つのオプションが表示されます。

   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

ありがとうございました!それはおそらく私がこれまでにそのような簡潔な表現で教えられた中で最もperlです。
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

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で指定)を、表示された回数ではなく、キーの値として保存するように適合させることができます。


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の質問に正確に答えていないことを理解していますが、私が行ったのと同じ理由でここにたどり着いた人のために投稿しています。それはスタックの問題です***あなたがいる質問を見つけることはほとんど不可能ですそれが存在する場合でも、スタック***はほとんど常にグーグルのトップヒットです!)


これは私のために働いた。これを投稿していただきありがとうございます。依存関係をインストール/更新するためのアクセス権があまりない環境でこれが必要でした。
AshishKumar19年


0

インストールされているモジュールのリストを出力するPerlワンライナーは次のとおりです。

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

Data :: Dumperがインストールされていることを確認してください。


2
これは、「cpan -l」がリストする5945の代わりに、約15のperlモジュールのみをリストします。
ポールトゥームリン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スクリプトを入力すると、インストールされているすべてのモジュールが@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

何故なの?find `perl -le'print for@INC'` -name '*.pm'
Hynek -Pichi- Vychodil 2017

-2

Linuxの場合、最も簡単な方法は次のとおりです。

dpkg -l | grep "perl"

1
OPは、perlがシステムにインストールされているかどうかではなく、システムにインストールされているCPAN(perl)モジュールのリストを要求しました(どちらのOPも、aptが利用可能かどうかを教えてくれませんでした)
ROLO 2018年

私はperlの専門家ではありませんが、上記のコマンドからインストールされたperlモジュールを見てきました。ここでは完璧な答えではないかもしれません。
Yasiru G 2018

-2

これは私のために働きます

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

このコードスニペットをありがとうございます。これは、限られた即時のヘルプを提供する可能性があります。適切な説明が大幅に長期的な価値を向上させるだろう示すことによって、なぜこれが問題に良い解決策であり、他の、同様の質問を将来の読者にそれがより便利になるだろう。あなたが行った仮定を含むいくつかの説明を追加するためにあなたの答えを編集してください。
–Machavity

-3

これが私がしていることです。perl -M{cpan_module}
エラーが表示されない場合は、モジュールがインストールされている可能性があります。


2
これが質問に答えるとは思わない。この提案を使用すると、モジュールごとに、インストールされているモジュールを見つけるのにかなりの時間がかかる可能性があります。
デイブニューマン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.