web-dev-qa-db-ja.com

モジュールを使用するときにPerlがロードしたファイルを見つけるにはどうすればよいですか?

perlでは、use <module name> <ver>;を実行すると、システムはライブラリの.pmファイルを@INCパスのどこかに見つけます。

実際にどのファイルが読み込まれたかについて信頼できる方法はありますか?

46
mmccoo

はい、 - %INC モジュールのロード元の完全パスが含まれています。

例:

$ Perl -M'Data::Dump qw(pp)' -e 'pp(\%INC)'
{
  "Data/Dump.pm"         => "/usr/share/Perl5/Data/Dump.pm",
  "Exporter.pm"          => "/usr/share/Perl/5.10/Exporter.pm",
  "List/Util.pm"         => "/usr/lib/Perl/5.10/List/Util.pm",
  "Scalar/Util.pm"       => "/usr/lib/Perl/5.10/Scalar/Util.pm",
  "XSLoader.pm"          => "/usr/lib/Perl/5.10/XSLoader.pm",
  "overload.pm"          => "/usr/share/Perl/5.10/overload.pm",
  "strict.pm"            => "/usr/share/Perl/5.10/strict.pm",
  "vars.pm"              => "/usr/share/Perl/5.10/vars.pm",
  "warnings.pm"          => "/usr/share/Perl/5.10/warnings.pm",
  "warnings/register.pm" => "/usr/share/Perl/5.10/warnings/register.pm",
}
71
derobert

モジュールにポッドドキュメントがあり、PATH内のperldocユーティリティがスクリプトを実行している同じPerlに属していることが保証できる場合、このコマンドは実際のファイルを見つけることができます。

perldoc -l ModuleName
8
skiphoppy

Perl -M'LWP '-e' use Data :: Dumper;ダンパー\%INC 'を印刷する| grep LWP

これにより、ディスク上のLWPモジュールの場所が一覧表示され、LWP内に読み込まれたモジュールも一覧表示されます。

      'LWP.pm' => '/usr/lib/Perl5/5.10.0/LWP.pm',
      'LWP/Protocol.pm' => '/usr/lib/Perl5/5.10.0/LWP/Protocol.pm',
      'LWP/UserAgent.pm' => '/usr/lib/Perl5/5.10.0/LWP/UserAgent.pm',
7
user1121750

dorequire、またはuseを使用してロードしたライブラリ用にロードしたファイル名を記録する%INC変数を調べます。詳細は perlvar を参照してください。

6
brian d foy

モジュールがインストールされているかどうか、およびモジュールのロード元を決定するためのワンライナー(bashラッパー付き)は次のとおりです。

#!/bin/bash
Perl -M${1} -le "\$mname=\"${1}.pm\";\$mname=~s#::#/#g;print \"$1 INSTALLED AT \$INC{\$mname}\";" 2>/dev/null || echo "${1} NOT INSTALLED"

Perlのモジュール名構文で呼び出します。

./find_Perl_module  Font::Metrics::Courier
4

CPANにはこの情報を見つけるのに十分な数のモジュールがあります。最も可能性の高い候補は、Module :: Find、Module :: Which、およびModule :: Locateです。私はおそらくModule :: Locateに行きます:

use strict;
use warnings;
use Module::Locate qw/locate/;

my $to_find = "Some::Module";

print "Perl would use: ", scalar locate($to_find), "\n";

リストコンテキストでは、locateは、見つかったすべてのSome :: Moduleのコピーを@INCに基づいて順番に返します。

編集: derobertははるかに優れた方法を提案しています 、%INCがすでに持っていることに気づきませんでした...このモジュールベースのソリューションは、モジュールをロードする前にそれを知りたい場合に役立ちます。からロードされます。

4
mikegrb

私が見つけたものから、Perlはパス内のディレクトリを調べます。

Perl -le 'print foreach @INC'

次に、標準ライブラリを検索し、次に現在のディレクトリを検索します。

検索順序が表示されます。

私の情報源:

ライブラリパスの拡張

1
John

シェルスクリプト/ usr/local/bin/which_Perl_moduleを使用します

#!/bin/sh

if [ ! $1 ];then echo "Which Perl module should I look for?"; exit; fi

echo -n "You are using: "
perldoc -l $1
echo "which I found by looking in:"
Perl -MData::Dump=pp -e 'unshift @INC, '$1'; pp(\@INC)'
0
Alexx Roche

Module :: Mapper は、@ INCツリーをウォークしてモジュールを見つける方法を提供します。

Perl -MModule::Mapper -MData::Dumper \
-e 'print Dumper( find_sources( UseINC => 1, Modules => [ @ARGV ] ) )' \
list-of-modules-to-locate
0
Hudson

Instmodshコマンドを使用できます: http://perldoc.Perl.org/instmodsh.html

0
Denis Howe