如何在使用模块时找到Perl加载的文件?

时间:2008-12-04 17:42:35

标签: perl module

在Perl中,当我use <module name> <ver>;时,系统会在.pm路径的某处找到库的@INC文件。

是否有可靠的方式来实际加载文件?

10 个答案:

答案 0 :(得分:70)

是的,%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",
}

答案 1 :(得分:8)

如果模块具有pod文档,并且如果可以保证PATH中的perldoc实用程序属于运行脚本的perl,则此命令通常会为您提供实际找到的文件:

perldoc -l ModuleName

答案 2 :(得分:7)

  

perl -M'LWP'-e'使用Data :: Dumper;打印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',

答案 3 :(得分:6)

您希望查看%INC变量,该变量会记录为您使用dorequireuse加载的库加载的文件名。有关详细信息,请参阅perlvar

答案 4 :(得分: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基于@INC按顺序返回Some :: Module的所有找到的副本。

编辑: derobert suggests a much better way,我没有意识到%INC已经拥有它......如果您想在加载模块之前知道它,那么这个基于模块的解决方案仍然有用。

答案 5 :(得分:4)

这是一个单行(带有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

答案 6 :(得分:1)

根据我的发现,perl会查看路径中的目录:

perl -le 'print foreach @INC'

然后它将在标准库中查找,然后在当前目录中查找。

它会为您提供搜索顺序。

我的来源:

Extending the library path

答案 7 :(得分:0)

Module::Mapper提供了一种遍历@INC树以查找模块的方法:

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

答案 8 :(得分:0)

您可以使用instmodsh命令:http://perldoc.perl.org/instmodsh.html

答案 9 :(得分:0)

我使用shell脚本/ 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)'