如何通过名称获取已安装的Perl模块的路径,例如Time::HiRes
?
我之所以需要这个是因为我必须在SGE Grid Engine系统的不同节点上运行我的perl脚本。有时候,甚至要使用其他用户名运行。
我可以使用CPAN.pm为自己安装软件包,但对于其他用户来说,如果没有在文件夹上执行chmod 666命令,就很难安装。
perl -MTime::HiRes -e 'print $INC{"Time/HiRes.pm"}'
或者 perldoc -l Time::HiRes
locate
命令只会排除NFS文件系统。
由于该系统上的PERL5LIB
有点长,因此使用find
命令不是一个好方法。 - GalaxyCan't find string terminator "'" anywhere before EOF at -e line 1.
,这是在Windows 7上发生的。命令:perl -MTime::HiRes -e "print $INC{'Time/HiRes.pm'}"
是有效的。 - Skurfurpacman
或 carton
(carton exec ...
)安装的模块。此外,您可以执行 perl -MTime::HiRes -e 'for my $k (keys %INC) { print "$k: $INC{$k}\n"; }'
。 - x-yuri大多数情况下,我使用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)
zefram@fysh.org
它甚至可以在你没有安装的模块上运行:
$ 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)
jand@activestate.com
我认为我可能需要像svn一样的XML选项。
PERL5LIB
中,会发生什么? - Galaxy注意:本解决方案建议使用您必须进行下载的(自编写的)实用程序。虽然它提供了我认为有用的功能,但首先安装第三方解决方案并非对所有人都是可行的选择。
我创建了whichpm
,一个跨平台命令行界面(Linux、macOS、Windows),通过模块(软件包)名称定位已安装的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 inhibit_exit避免在程序终止后停止, h q、h R或h o以获取其他信息。
DB 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' ...
这将有助于在模块具有相同名称但位于不同文件夹的情况下进行查找。
#!/bin/sh
echo 'print map { sprintf( "%20s : %s\n", $_, $INC{$_} ) } sort keys %INC; print "\n'$1' version : $'$1'::VERSION\n\n"' | perl "-M$1"
perl -MSTH::STH
时,脚本会打印出%INC中的所有内容。$ 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
perl -MYour::Module\ 999
。如果版本号小于999,则会打印出来。 - jrockway我喜欢使用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
。
#! /usr/bin/perl -w
use Time::HiRes();
new Time::HiRes();
export PERL5LIB=$PERL5LIB:~/perl ## tell perl where to look for "Devel"/"ptkdb.pm"
perl -d:ptkdb (yourscript.pl)
另一种可能有用的方法是搜索$PERL5LIB
中的所有文件夹。
perldoc -l
命令无法显示没有 pod
的自制 .pm
文件。 - Galaxyperl -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
结果应该是您的lib位置。perl -e 'print join("\n",@INC)'
use lib '/your/folder/location/to/lib';
perl -d
,然后输入M
。 - Will Sheppard