71

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

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

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

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

perl -e "use XML::Simple "

問題は何ですか?

4

10 に答える 10

108

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

perldoc -l XML::Simple

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

于 2009-06-24T15:32:26.253 に答える
49

クイック&ダーティ:

$ perl -MXML::Simple -e 1
于 2009-06-24T15:55:55.957 に答える
22
$ perl -MXML::Simple -le 'print $INC{"XML/Simple.pm"}'

perlvarエントリから%INC:

  • %INC

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

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

于 2009-06-24T15:43:22.520 に答える
17

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

perl -e 'use DBI;'

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

于 2013-03-01T16:15:10.367 に答える
11

モジュールがインストールされているかどうかをすばやく確認したい場合 (少なくともBashをシェルとして使用する Unix システムでは)、これを .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
于 2009-06-24T15:55:39.963 に答える
9

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

モジュールXML::Simpleは、 の@INC下のパスの1 つに存在しますXML/Simple.pm

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

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

于 2009-06-24T15:36:24.077 に答える
3

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

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

  • C:\>ppm query XML-SimpleXML::Simpleインストールされているかどうかを確認するには

于 2010-03-11T11:00:27.107 に答える
3

ながら (<@INC>)

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

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

for (@INC)
于 2009-06-24T15:54:20.340 に答える
0

@ user80168のソリューションにブラボー(私はまだカウントしています\!)が、エイリアスとシェルに関連するすべてのエスケープを避けるために:

%~/ 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するには、インストールする必要があります (コアモジュールではありません)。

于 2015-02-21T20:49:21.053 に答える
0

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

 perl -e 'foreach (@INC) {
    print `find $_ -type f -name "*.pm"`;
 }'
于 2014-08-16T03:02:37.870 に答える