web-dev-qa-db-ja.com

コマンドラインからシステムにPerlモジュールがインストールされているかどうかを確認するにはどうすればよいですか?

XML :: Simpleがシステムにインストールされているかどうかを確認しようとしました。

Perl -e 'while (<@INC>) { while (<$_/*.pm>) { print "$_\n"; } }'

上記のワンライナーは、システムにインストールされているすべてのモジュールをリストするために使用されました。ただし、XMLモジュールはリストされていません。

ただし、次は正常に実行されます。

Perl -e "use XML::Simple "

何が問題なのでしょうか?

56
joe

次の方法でモジュールのインストールパスを確認できます。

perldoc -l XML::Simple

ワンライナーの問題は、ディレクトリ/サブディレクトリを再帰的に走査しないことです。したがって、出力として実用的なモジュール名のみを取得します。

92

早くて汚い:

$ Perl -MXML::Simple -e 1
39
Sinan Ünür
$ Perl -MXML :: Simple -le 'print $ INC {"XML/Simple.pm"}'

perlvar エントリから %INC

  • %INC

ハッシュ%INCには、dorequire、またはuse演算子を介して含まれる各ファイル名のエントリが含まれます。キーは指定したファイル名で(モジュール名はパス名に変換されます)、値は見つかったファイルの場所です。 require演算子はこのハッシュを使用して、特定のファイルが既に含まれているかどうかを判断します。

ファイルがフック(たとえば、サブルーチン参照、これらのフックの説明については require を参照)を介してロードされた場合、このフックはデフォルトで%INCに挿入されますファイル名の。ただし、フックはそれ自体で%INCエントリを設定して、より具体的な情報を提供する場合があることに注意してください。

17
Greg Bacon

たとえば、DBIモジュールがインストールされているかどうかを確認するには、次を使用します。

Perl -e 'use DBI;'

インストールされていない場合、エラーが表示されます。 ( http://www.linuxask.com から)

12
Hamidjon

そこで行うことは、ディレクトリへの再帰ではありません。 @INCディレクトリのルートディレクトリにあるモジュールのみをリストしています。

モジュールXML::Simpleは、@INCの下のXML/Simple.pmパスのいずれかに存在します。

特定のモジュールを見つけるために彼が言ったこと。

CPANは、ここですべてのモジュールを見つける方法を説明しています。 インストールされているモジュールを見つける方法 を参照してください。

9
Salgar

モジュールがインストールされているかどうかをすばやく確認する場合(少なくともUnixシステムでは、シェルとして Bash を使用)、これを.bashrcファイルに追加します。

alias modver="Perl -e\"eval qq{use \\\$ARGV[0];\\\\\\\$v=\\\\\\\$\\\${ARGV[0]}::VERSION;};\ print\\\$@?qq{No module found\\n}:\\\$v?qq{Version \\\$v\\n}:qq{Found.\\n};\"\$1"

その後、次のことができます。

=> modver XML::Simple
No module found

=> modver DBI
Version 1.607
8
user80168

Windowsで ActivePerl を実行している場合:

  • C:\>ppm query *インストールされているすべてのモジュールのリストを取得する

  • C:\>ppm query XML-SimpleXML::Simpleがインストールされています

3
Zaid

while(<@INC>)

これは、@ INCのパスをスペースで区切られた文字列に結合し、その文字列に対してglob()を呼び出し、スペースで区切られたコンポーネントを繰り返し処理します(ファイルグロビングメタ文字がない場合)。

これは、スペース、\、[]、{}、*、?、または〜を含む@INCにパスがあり、安全な代替手段を避ける理由がないように思える場合、うまく機能しません。

for (@INC)
3
ysth

@ user80168のソリューションのBravo(まだ\を数えています!)が、エイリアスとシェルに関連するすべてのエスケープを回避するために:

%~/ cat ~/bin/perlmod
Perl -le'eval qq{require $ARGV[0]; } 
    ? print ( "Found $ARGV[0] Version: ", eval "$ARGV[0]->VERSION" ) 
    : print "Not installed" ' $1

合理的に機能します。

Module::Runtime を使用した、最も単純で最も「現代的な」アプローチがあります。

Perl -MModule::Runtime=use_module -E '
     say "$ARGV[0] ", use_module($ARGV[0])->VERSION' DBI

モジュールがインストールされていない場合、これは有用なエラーを返します。

-MModule::Runtimeを使用するには、インストールする必要があります(コアモジュールではありません)。

0
G. Cito

あなたのソリューションは、@ INC配列に含まれる各ディレクトリパスのルートのみを見ると信じています。次のような再帰的なものが必要です。

 Perl -e 'foreach (@INC) {
    print `find $_ -type f -name "*.pm"`;
 }'
0
GL2014