在Perl中,当我这样做时use <module name> <ver>;,系统会.pm在@INC路径中的某个位置找到库的文件.
是否有可靠的方式来实际加载文件?
der*_*ert 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",
}
Run Code Online (Sandbox Code Playgroud)
如果模块具有pod文档,并且如果可以保证PATH中的perldoc实用程序属于运行脚本的相同perl,则此命令通常会为您提供实际找到的文件:
perldoc -l ModuleName
Run Code Online (Sandbox Code Playgroud)
小智 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',
Run Code Online (Sandbox Code Playgroud)
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";
Run Code Online (Sandbox Code Playgroud)
在列表上下文中,locate 根据@INC 按顺序返回所有找到的 Some::Module 副本。
编辑: derobert 提出了一个更好的方法,我没有意识到 %INC 已经有了它......如果您想在加载模块之前知道从哪里加载它,这个基于模块的解决方案仍然很有用。
小智 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"
Run Code Online (Sandbox Code Playgroud)
使用 perl 的模块名称语法调用它:
./find_perl_module Font::Metrics::Courier
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
25004 次 |
| 最近记录: |