Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

Примечание. В этом решении предлагается использовать (самостоятельно созданную) утилиту, которую необходимо загрузить. Несмотря на то, что он предлагает полезные функции, сначала стоит установить стороннее решение не для всех.


Я создал 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 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

Installation

УстановкаПредварительные условия: Linux, macOS или Windows, с установленным 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).

Ответ 2

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

Ответ 3

Вы можете получить информацию о модуле с помощью инструмента 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)
    [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]

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

Ответ 4

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

[[email protected] ~]$ 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'
...

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

Ответ 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" 

script просто распечатайте все в% 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

Ответ 6

Мне нравится использовать модуль 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

Ответ 7

Похоже, что самый простой способ - perldoc -l Time::HiRes.


Если это по какой-то причине недоступно, здесь прагматическое решение:

Шаг 1. Создайте модуль в script...

#! /usr/bin/perl -w
use Time::HiRes();
new Time::HiRes();

Шаг 2: Выполните script с помощью графического отладчика Perl...

export PERL5LIB=$PERL5LIB:~/perl ## tell perl where to look for "Devel"/"ptkdb.pm"
perl -d:ptkdb (yourscript.pl)

Шаг 3: Step in к вызову new.

Полный путь к модулю будет отображаться в строке заголовка окна отладчика.


Другим подходом, который может быть полезным, является поиск всех папок в $PERL5LIB.