48

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

ファイルが実際にロードされた信頼できる方法はありますか?

4

10 に答える 10

71

はい、%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",
}
于 2008-12-04T18:11:16.683 に答える
9

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',
于 2011-12-29T19:56:48.017 に答える
9

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

perldoc -l ModuleName
于 2008-12-05T15:15:46.567 に答える
7

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

于 2008-12-04T21:03:00.330 に答える
5

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 は @INC に基づいた順序で Some::Module のすべての見つかったコピーを返します。

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

于 2008-12-04T18:10:56.590 に答える
5

モジュールがインストールされているかどうか、およびどこからロードされるかを判断するためのワンライナー (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
于 2010-06-09T17:02:41.553 に答える
2

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

perl -le 'print foreach @INC'

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

それはあなたに検索順序を与えます。

私の情報源:

ライブラリパスの拡張

于 2008-12-04T17:53:31.833 に答える
1

Module::Mapperは @INC ツリーをたどってモジュールを見つける方法を提供します:

perl -MModule::Mapper -MData::Dumper \
-e 'print Dumper( find_sources( UseINC => 1, Modules => [ @ARGV ] ) )' \
list-of-modules-to-locate
于 2008-12-04T18:22:50.277 に答える
0

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

于 2012-01-16T09:50:58.877 に答える
0

シェルスクリプト /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)'
于 2012-02-03T10:51:01.200 に答える