Как узнать, где установлен модуль Perl?
Как получить путь к установленному модулю Perl по имени,
например Time::HiRes
?
Я хочу это только потому, что мне нужно запустить my perl script на разных узлах системы SGE Grid Engine. Иногда даже запускается как другое имя пользователя.
Я могу использовать CPAN.pm для установки пакетов для себя, но его не так просто установить для других пользователей без chmod 666 в папках.
Ответы
Ответ 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
.