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