57

如何按名称获取已安装 Perl 模块的路径,例如Time::HiRes

我想要这个只是因为我必须在 SGE Grid Engine 系统的不同节点上运行我的 perl 脚本。有时,甚至以其他用户名运行。

我可以使用 CPAN.pm 为自己安装软件包,但对于没有 chmod 666 文件夹的其他用户来说安装并不容易。

4

10 回答 10

93

perl -MTime::HiRes -e 'print $INC{"Time/HiRes.pm"}'或者perldoc -l Time::HiRes

于 2009-10-13T02:41:36.170 回答
30

我主要perldoc用来获取位置:

$ perldoc -l Module

您还可以cpan使用 Perl 附带的工具获取模块详细信息:

$ 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 选项。

于 2009-10-13T07:05:59.287 回答
21

注意:此解决方案建议使用您必须下载的(自行创作的)实用程序虽然它提供了我认为有用的功能,但并不是每个人都可以先安装第三方解决方案。


我已经创建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

安装

先决条件:LinuxmacOSWindows,安装了Perl v5.4.50 或更高版本。

从 npm 注册表安装

安装Node.js或io.js后,按如下方式安装包:

[sudo] npm install whichpm -g

手动安装(macOS 和 Linux)

  • 将 CLI下载为whichpm.
  • 使其可执行chmod +x whichpm
  • 将其移动或符号链接到您的文件夹中$PATH,例如/usr/local/bin(OSX) 或/usr/bin(Linux)。
于 2015-09-01T22:51:07.450 回答
9

如果需要查找脚本实际使用了哪些模块,可以使用 perl debuggersM命令:

[ivan@server ~]$ perl -d your_script.pl
...

调试程序终止。使用 q 退出或 R 重新启动,
  使用 o inhibitor_exit 避免程序终止后停止,
  hq、h R 或 ho 以获取更多信息。

数据库_
'AutoLoader.pm' => '5.60 来自 /usr/lib/perl5/5.8.8/AutoLoader.pm'
'Carp.pm' => '1.04 来自 /usr/lib/perl5/5.8.8/Carp.pm'
...

如果您有相同名称但位于不同文件夹中的模块,这将有所帮助。

于 2009-10-13T16:30:28.970 回答
4

我只是找到另一个: 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
于 2009-10-13T02:55:49.027 回答
3

我喜欢使用V模块。

libv-perl只需从 CPAN 或通过在 Debian 或 Ubuntu 上安装软件包来安装它。

然后像这样使用它:

$ 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
于 2016-10-06T14:15:00.887 回答
1

似乎最简单的方法是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)

Step in第三步:new来电。

模块的完整路径名将显示在调试器窗口的标题栏上。


另一种可能有用的方法是搜索$PERL5LIB.

于 2015-11-17T02:01:37.660 回答
0

为了扩展@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
于 2020-04-06T15:05:28.813 回答
0

在 OSX 中,您可以使用:

perl -e '打印连接(“\n”,@INC)'

结果应该是您的库的位置。

然后将此代码添加到您的 Perl 代码中:

use lib '/your/folder/location/to/lib';
于 2020-10-04T16:29:57.087 回答
0

Perldoc -l 为我工作

perldoc -l "File::Find"
/opt/perl_32/lib/5.8.8/File/Find.pm
于 2021-10-11T07:41:40.613 回答