【问题标题】:How can I find out where a Perl module is installed?如何找出 Perl 模块的安装位置?
【发布时间】:2010-12-06 04:33:19
【问题描述】:

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

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

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

【问题讨论】:

  • 你为什么想知道这个?您是在另一个程序中需要它还是只想在命令行中看到它?
  • 到目前为止,最简单的方法在Ivan's answer 中进行了描述,即使用perl -d,然后输入M

标签: perl path module config


【解决方案1】:

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

【讨论】:

  • perldoc 仅适用于已设置的那些。第一个适用于所有人,但输入名称 2 次有点无聊。
  • 如果定位数据库没有它,无论出于何种原因,find /usr/ -path '*/Time/HiRes.pm'
  • 这并不能告诉你 Perl 在哪里寻找文件。例如,我的 Perl 模块位于 ~/perl/install 中。
  • 好吧,在我的情况下,用户文件都在 NFS 路径中,并且定位只是排除 NFS。由于PERL5LIB 在该系统上有点长,find 不是一个好方法。
  • 对于 Windows,可能需要在外部使用双引号,在内部使用单引号。给定错误的命令:Windows 7 上的Can't find string terminator "'" anywhere before EOF at -e line 1.。命令:perl -MTime::HiRes -e "print $INC{'Time/HiRes.pm'}" 有效。
【解决方案2】:

我主要使用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 选项。

【讨论】:

  • 但是,只有 CPAN 上的所有内容。
  • 我不明白你的评论。
  • 如果写FOO::Bar之类的包,放在PERL5LIB里呢?
【解决方案3】:

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


我创建了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

安装

先决条件:Linuxma​​cOSWindows,并安装了 Perl v5.4.50 或更高版本

从 npm 注册表安装

安装Node.jsio.js后,安装the package如下:

[sudo] npm install whichpm -g

手动安装(macOS 和 Linux)

  • the CLI 下载为whichpm
  • 使用chmod +x whichpm 使其可执行。
  • 将其移动或符号链接到$PATH 中的文件夹,例如/usr/local/bin (OSX) 或/usr/bin (Linux)。

【讨论】:

  • 谢谢,@Galaxy。您链接到的代码绝对很方便。 解决方案增加了:在 OS X 和 Windows 上检测大小写不精确的名称、核心模块状态、查找重复项以及直接打开模块进行编辑的能力。
【解决方案4】:

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

[ivan@server ~]$ perl -d your_script.pl ... 调试程序终止。使用 q 退出或 R 重新启动, 使用 o inhibitor_exit 避免程序终止后停止, 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' ...

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

【讨论】:

  • 这是最好的答案,因为它非常简单,不需要下载任何额外的软件。
【解决方案5】:

我刚刚找到另一个: 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" 

当您运行 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,就会打印出来。
  • 好的,但除非你能解释这是怎么回事,否则不要投票。
  • 在 Perl 中执行此操作而不是在其周围包装一个 shell 脚本会不会更容易?
【解决方案6】:

我喜欢使用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

【讨论】:

    【解决方案7】:

    似乎最简单的方法是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 中的所有文件夹。

    【讨论】:

    • perldoc -l 不会显示您自制的 .pm 文件,如果没有 pod
    • @Galaxy 如果您不知道您自制的 .pm 文件在哪里,那么您如何包含它们?
    • 我设置了多个 PERL5LIB 位置,我需要知道哪个位置适用于该 pm 文件。
    【解决方案8】:

    为了扩展@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
    

    【讨论】:

      【解决方案9】:

      在 OSX 中你可以使用:

      perl -e 'print join("\n",@INC)'

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

      然后在你的 Perl 代码中添加这段代码:

      use lib '/your/folder/location/to/lib';
      

      【讨论】:

        【解决方案10】:

        Perldoc -l 为我工作

        perldoc -l "File::Find"
        /opt/perl_32/lib/5.8.8/File/Find.pm
        

        【讨论】:

          猜你喜欢
          • 2017-05-22
          • 2010-12-27
          • 1970-01-01
          • 1970-01-01
          • 2017-06-08
          • 2010-09-13
          • 1970-01-01
          • 1970-01-01
          • 2020-08-07
          相关资源
          最近更新 更多