コマンドラインからシステムにPerlモジュールがインストールされているかどうかを確認するにはどうすればよいですか?
-
22-07-2019 - |
質問
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 を参照)これらのフックの説明については)、このフックはデフォルトでファイル名の代わりに<=>に挿入されます。ただし、フックはそれ自体で%INCエントリを設定して、より具体的な情報を提供している可能性があることに注意してください。
たとえば、DBIモジュールがインストールされているかどうかを確認するには、
を使用しますperl -e 'use DBI;'
インストールされていない場合、エラーが表示されます。 ( http://www.linuxask.com から)
そこで行うことは、ディレクトリへの再帰ではありません。 @INC
ディレクトリのルートディレクトリにあるモジュールのみをリストしています。
モジュールXML::Simple
は、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
while(<!> lt; @INC <!> gt;)
これは、@ INCのパスをスペースで区切られた文字列に結合し、その文字列でglob()を呼び出して、スペースで区切られたコンポーネントを繰り返し処理します(ファイルグロビングメタ文字がない場合)。
スペース、\、[]、{}、*、?、または〜を含むパスが@INCにある場合、これはあまりうまく機能しません。 安全な代替手段を避ける理由はないようです:
for (@INC)
Windowsで ActivePerl を実行している場合:
-
C:\>ppm query *
インストールされているすべてのモジュールのリストを取得するには -
C:\>ppm query XML-Simple
でXML::Simple
がインストールされているかどうかを確認します
あなたのソリューションは、@ INC配列に含まれる各ディレクトリパスのルートのみを見ると信じています。次のような再帰的なものが必要です:
perl -e 'foreach (@INC) {
print `find $_ -type f -name "*.pm"`;
}'
@ user80168のソリューションのブラボー(まだ\
を数えています!)が、エイリアスとシェルに関連するすべてのエスケープを回避するために:
%~/ cat ~/bin/perlmod
perl -le'eval qq{require $ARGV[0]; }
? print ( "Found $ARGV[0] Version: ", eval "$ARGV[0]->VERSION" )
: print "Not installed" ' $1
十分に機能します。
これは最も単純で最も<!> quot; modern <!> quot;かもしれません。 Module::Runtime
:
perl -MModule::Runtime=use_module -E '
say "$ARGV[0] ", use_module($ARGV[0])->VERSION' DBI
モジュールがインストールされていない場合、これは有用なエラーを返します。
-MModule::Runtime
を使用するには、インストールする必要があります(コアモジュールではありません)。