Как узнать, где установлен модуль Perl?

Как получить путь установленного модуля Perl по имени, например,Time::HiRes?

Я хочу этого только потому, что мне нужно запустить мой скрипт perl на разных узлах системы SGE Grid Engine. Иногда, даже запустить как другое имя пользователя.

Я могу использовать CPAN.pm для установки пакетов для себя, но не так просто установить для других пользователей без chmod 666 по папкам.

7 ответов


Я создал whichpm, a кросс-платформенный CLI (Linux, OSX, 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, OSX или Windows, с Perl v5.4.50 или выше установлен.

установка из реестра npm

С узел.js или io.js установить пакета следующим образом:

[sudo] npm install whichpm -g

ручная установка (OSX и Linux)

  • скачать CLI as whichpm.
  • сделайте его исполняемым с chmod +x whichpm.
  • переместить его или симлинк в папку в ваш $PATH, например /usr/local/bin (OSX) или /usr/bin (Linux).

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


вы можете получить детали модуля с помощью инструмента 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

Я думаю, может быть, мне нужен параметр XML, такой как svn.


Я просто нахожу другой: http://www.perlmonks.org/?node_id=568730

#!/bin/sh

echo 'print map { sprintf( "%20s : %s\n", $_, $INC{$_} ) } sort keys %INC; print "\n'' version : $''::VERSION\n\n"' | perl "-M" 

скрипт просто распечатывает все в %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

Если нужно найти, какие модули фактически используются вашим скриптом, вы можете использовать отладчики perl :

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

Debugged program terminated.  Use q to quit or R to restart,
  use o inhibit_exit to avoid stopping after program termination,
  h q, h R or h o to get additional info.

DB M
'AutoLoader.pm' => '5.60 from /usr/lib/perl5/5.8.8/AutoLoader.pm'
'Carp.pm' => '1.04 from /usr/lib/perl5/5.8.8/Carp.pm'
...

это поможет в случае, если у вас есть модули с одинаковыми именами, но в другой папке.


мне нравится использовать V модуль.

просто установите его из CPAN или установив пакет libv-perl на 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

кажется, что самый простой способ -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.