XML :: Simpleがシステムにインストールされているかどうかを確認しようとしました。
Perl -e 'while (<@INC>) { while (<$_/*.pm>) { print "$_\n"; } }'
上記のワンライナーは、システムにインストールされているすべてのモジュールをリストするために使用されました。ただし、XMLモジュールはリストされていません。
ただし、次は正常に実行されます。
Perl -e "use XML::Simple "
何が問題なのでしょうか?
次の方法でモジュールのインストールパスを確認できます。
perldoc -l XML::Simple
ワンライナーの問題は、ディレクトリ/サブディレクトリを再帰的に走査しないことです。したがって、出力として実用的なモジュール名のみを取得します。
早くて汚い:
$ Perl -MXML::Simple -e 1
$ Perl -MXML :: Simple -le 'print $ INC {"XML/Simple.pm"}'
- %INC
ハッシュ
%INC
には、do
、require
、またはuse
演算子を介して含まれる各ファイル名のエントリが含まれます。キーは指定したファイル名で(モジュール名はパス名に変換されます)、値は見つかったファイルの場所です。require
演算子はこのハッシュを使用して、特定のファイルが既に含まれているかどうかを判断します。ファイルがフック(たとえば、サブルーチン参照、これらのフックの説明については require を参照)を介してロードされた場合、このフックはデフォルトで
%INC
に挿入されますファイル名の。ただし、フックはそれ自体で%INCエントリを設定して、より具体的な情報を提供する場合があることに注意してください。
たとえば、DBIモジュールがインストールされているかどうかを確認するには、次を使用します。
Perl -e 'use DBI;'
インストールされていない場合、エラーが表示されます。 ( http://www.linuxask.com から)
そこで行うことは、ディレクトリへの再帰ではありません。 @INC
ディレクトリのルートディレクトリにあるモジュールのみをリストしています。
モジュールXML::Simple
は、@INC
の下のXML/Simple.pm
パスのいずれかに存在します。
特定のモジュールを見つけるために彼が言ったこと。
CPAN
は、ここですべてのモジュールを見つける方法を説明しています。 インストールされているモジュールを見つける方法 を参照してください。
モジュールがインストールされているかどうかをすばやく確認する場合(少なくとも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
Windowsで ActivePerl を実行している場合:
C:\>ppm query *
インストールされているすべてのモジュールのリストを取得する
C:\>ppm query XML-Simple
XML::Simple
がインストールされています
while(<@INC>)
これは、@ INCのパスをスペースで区切られた文字列に結合し、その文字列に対してglob()を呼び出し、スペースで区切られたコンポーネントを繰り返し処理します(ファイルグロビングメタ文字がない場合)。
これは、スペース、\、[]、{}、*、?、または〜を含む@INCにパスがあり、安全な代替手段を避ける理由がないように思える場合、うまく機能しません。
for (@INC)
@ 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
を使用するには、インストールする必要があります(コアモジュールではありません)。
あなたのソリューションは、@ INC配列に含まれる各ディレクトリパスのルートのみを見ると信じています。次のような再帰的なものが必要です。
Perl -e 'foreach (@INC) {
print `find $_ -type f -name "*.pm"`;
}'