如何通过名称获取已安装 Perl 模块的路径, 例如
Time::HiRes
?
我想要这个只是因为我必须在 SGE Grid Engine 系统的不同节点上运行我的 perl 脚本。有时,甚至以其他用户名运行。
我可以使用 CPAN.pm 为自己安装软件包,但如果没有对文件夹进行 chmod 666,其他用户的安装就没那么容易了。
perl -MTime::HiRes -e 'print $INC{"Time/HiRes.pm"}'
或 perldoc -l Time::HiRes
我主要使用
perldoc
来获取位置:
$ perldoc -l Module
您还可以使用 Perl 自带的
cpan
工具获取模块详细信息:
$ cpan -D Time::HiRes
Time::HiRes
-------------------------------------------------------------------------
High resolution time, sleep, and alarm
J/JH/JHI/Time-HiRes-1.9719.tar.gz
/usr/local/perls/perl-5.10.0/lib/5.10.0/darwin-2level/Time/HiRes.pm
Installed: 1.9711
CPAN: 1.9719 Not up to date
Andrew Main (Zefram) (ZEFRAM)
[email protected]
它甚至适用于您尚未安装的模块:
$ cpan -D Win32::Process
Win32::Process
-------------------------------------------------------------------------
Interface to Win32 Process functions
J/JD/JDB/Win32-Process-0.14.tar.gz
Installed:
CPAN: 0.14 Not up to date
Jan Dubois (JDB)
[email protected]
我想也许我需要像 svn 这样的 XML 选项。
注意:此解决方案建议使用(自行创作的)实用程序,您必须下载。虽然它提供了我认为有用的功能,但首先安装第三方解决方案并不是每个人都可以选择。
whichpm
,一个跨平台 CLI(Linux、macOS、Window),它按模块(包)名称定位已安装的 Perl 模块,并可选择报告有关它们的信息,包括检测意外重复。
示例
# Locate the Data::Dumper module.
$ whichpm Data::Dumper
/usr/lib/perl/5.18/Data/Dumper.pm
# Locate the Data::Dumper module, and also print
# version information and core-module status.
$ whichpm -v Data::Dumper
Data::Dumper 2.145 core>=5.005 /usr/lib/perl/5.18/Data/Dumper.pm
# Locate the Data::Dumper module and open it in your system's default text
# editor.
$ whichpm -e Data::Dumper
# Look for accidental duplicates of the Foo::Bar module.
# Normally, only 1 path should be returned.
$ whichpm -a Foo::Bar
/usr/lib/perl/5.18/Foo/Bar.pm
./Foo/Bar.pm
# Print the paths of all installed modules.
$ whichpm -a
先决条件:Linux、macOS 或 Windows,并安装 Perl v5.4.50 或更高版本。
安装了 Node.js 或 io.js 后,安装 软件包,如下所示:
[sudo] npm install whichpm -g
whichpm
。chmod +x whichpm
使其可执行。$PATH
中的文件夹,例如 /usr/local/bin
(OSX) 或 /usr/bin
(Linux)。如果需要查找脚本实际使用的模块,您可以使用 perl 调试器
M
命令:
[ivan@server ~]$ perl -d your_script.pl ... 调试后的程序终止。使用 q 退出或使用 R 重新启动, 使用 o抑制_退出以避免程序终止后停止, h q、h R 或 h o 以获得更多信息。 数据库M 'AutoLoader.pm' => '5.60 来自 /usr/lib/perl5/5.8.8/AutoLoader.pm' 'Carp.pm' => '1.04 来自 /usr/lib/perl5/5.8.8/Carp.pm' ...
如果您的模块具有相同名称但位于不同的文件夹中,这将很有帮助。
我刚刚找到了另一个: http://www.perlmonks.org/?node_id=568730
#!/bin/sh
echo 'print map { sprintf( "%20s : %s\n", $_, $INC{$_} ) } sort keys %INC; print "\n'$1' version : $'$1'::VERSION\n\n"' | perl "-M$1"
当您运行时,脚本只会打印出 %INC 中的所有内容
perl -MSTH::STH
例如:
$ whichpm CGI
CGI.pm : /System/Library/Perl/5.8.6/CGI.pm
CGI/Util.pm : /System/Library/Perl/5.8.6/CGI/Util.pm
Carp.pm : /System/Library/Perl/5.8.6/Carp.pm
Exporter.pm : /System/Library/Perl/5.8.6/Exporter.pm
constant.pm : /System/Library/Perl/5.8.6/constant.pm
overload.pm : /System/Library/Perl/5.8.6/overload.pm
strict.pm : /System/Library/Perl/5.8.6/strict.pm
vars.pm : /System/Library/Perl/5.8.6/vars.pm
warnings.pm : /System/Library/Perl/5.8.6/warnings.pm warnings/register.pm : /System/Library/Perl/5.8.6/warnings/register.pm
CGI version : 3.05
我喜欢使用V模块。
只需从 CPAN 安装它或在 Debian 或 Ubuntu 上安装软件包
libv-perl
。
然后像这样使用它:
$ perl -MV=DBI
DBI
/Users/michiel/.plenv/versions/5.24.0/lib/perl5/site_perl/5.24.0/darwin-2level/DBI.pm: 1.636
其他输出示例:
$ perl -MV=Time::HiRes
Time::HiRes
/usr/lib/perl/5.18/Time/HiRes.pm: 1.9725
perldoc -l
对我有用
perldoc -l "File::Find"
/opt/perl_32/lib/5.8.8/File/Find.pm
看来最简单的方法是
perldoc -l Time::HiRes
。
如果由于某种原因无法使用,这里有一个实用的解决方案:
第 1 步:在脚本中实例化模块...
#! /usr/bin/perl -w
use Time::HiRes();
new Time::HiRes();
第 2 步:使用 Perl 图形调试器执行脚本...
export PERL5LIB=$PERL5LIB:~/perl ## tell perl where to look for "Devel"/"ptkdb.pm"
perl -d:ptkdb (yourscript.pl)
第 3 步:
Step in
拨打 new
电话。
模块的完整路径名将显示在调试器窗口的标题栏上。
另一种可能有用的方法是搜索
$PERL5LIB
中的所有文件夹。
为了扩展 @Ivan 的答案,允许在不安装其他软件的情况下运行它,以下将使用 Perl 的调试器来查找特定的模块(或多个模块):
perl -de 'use <Module Name>;'
例如:
perl -de 'use DBD::Oracle;'
输出:
Loading DB routines from perl5db.pl version 1.37
Editor support available.
Enter h or 'h h' for help, or 'man perldebug' for more help.
DBD::Oracle::CODE(0x27f81d8)(/usr/local/lib64/perl5/DBD/Oracle.pm:113):
113: $ENV{PERL_BADFREE} = 0;
DB<1> q
在 OSX 中您可以使用:
perl -e '打印连接(“ “,@INC)'
结果应该是你的库的位置。
然后将此代码添加到您的 Perl 代码中:
use lib '/your/folder/location/to/lib';