Как мне найти какой файл Perl загружен, когда я использую модуль? - PullRequest
46 голосов
/ 04 декабря 2008

в Perl, когда я делаю use <module name> <ver>;, система находит файл .pm для библиотеки где-то по пути @INC.

Есть ли надежный способ загрузки файла?

Ответы [ 10 ]

70 голосов
/ 04 декабря 2008

Да, %INC содержит полный путь, из которого был загружен модуль.

Пример:

$ perl -M'Data::Dump qw(pp)' -e 'pp(\%INC)'
{
  "Data/Dump.pm"         => "/usr/share/perl5/Data/Dump.pm",
  "Exporter.pm"          => "/usr/share/perl/5.10/Exporter.pm",
  "List/Util.pm"         => "/usr/lib/perl/5.10/List/Util.pm",
  "Scalar/Util.pm"       => "/usr/lib/perl/5.10/Scalar/Util.pm",
  "XSLoader.pm"          => "/usr/lib/perl/5.10/XSLoader.pm",
  "overload.pm"          => "/usr/share/perl/5.10/overload.pm",
  "strict.pm"            => "/usr/share/perl/5.10/strict.pm",
  "vars.pm"              => "/usr/share/perl/5.10/vars.pm",
  "warnings.pm"          => "/usr/share/perl/5.10/warnings.pm",
  "warnings/register.pm" => "/usr/share/perl/5.10/warnings/register.pm",
}
8 голосов
/ 05 декабря 2008

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

perldoc -l ModuleName
7 голосов
/ 29 декабря 2011

perl -M'LWP '-e' use Data :: Dumper; распечатать самосвал \% INC '| grep LWP

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

      'LWP.pm' => '/usr/lib/perl5/5.10.0/LWP.pm',
      'LWP/Protocol.pm' => '/usr/lib/perl5/5.10.0/LWP/Protocol.pm',
      'LWP/UserAgent.pm' => '/usr/lib/perl5/5.10.0/LWP/UserAgent.pm',
6 голосов
/ 05 декабря 2008

Вы хотите просмотреть переменную %INC, в которой записано имя файла, загруженного для библиотек, загружаемых с помощью do, require или use. Подробности смотрите perlvar .

4 голосов
/ 09 июня 2010

Вот однострочная (с оболочкой bash), чтобы определить, установлен ли модуль и откуда он будет загружен:

#!/bin/bash
perl -M${1} -le "\$mname=\"${1}.pm\";\$mname=~s#::#/#g;print \"$1 INSTALLED AT \$INC{\$mname}\";" 2>/dev/null || echo "${1} NOT INSTALLED"

Вызовите его с синтаксисом имени модуля perl:

./find_perl_module  Font::Metrics::Courier
4 голосов
/ 04 декабря 2008

В CPAN имеется достаточное количество модулей для поиска этой информации, наиболее вероятными кандидатами являются Module :: Find, Module :: Which и Module :: Locate. Я бы, наверное, пошел с Module :: Locate:

use strict;
use warnings;
use Module::Locate qw/locate/;

my $to_find = "Some::Module";

print "Perl would use: ", scalar locate($to_find), "\n";

В контексте списка locate возвращает все найденные копии Some :: Module в порядке, основанном на @ INC.

Edit: Дероберт предлагает гораздо лучший способ , я не осознавал, что% INC уже его имеет ... Это решение на основе модулей все равно будет полезно, если вы захотите узнать перед загрузкой модуля, куда он будет загружаться с.

1 голос
/ 04 декабря 2008

Из того, что я нашел, Perl будет искать в каталогах путь:

perl -le 'print foreach @INC'

Затем он будет выглядеть в стандартной библиотеке, а затем в текущем каталоге.

Это дает вам порядок поиска.

Мой источник:

Расширение пути к библиотеке

0 голосов
/ 03 февраля 2012

Я использую скрипт оболочки / usr / local / bin / which_perl_module

#!/bin/sh

if [ ! $1 ];then echo "Which perl module should I look for?"; exit; fi

echo -n "You are using: "
perldoc -l $1
echo "which I found by looking in:"
perl -MData::Dump=pp -e 'unshift @INC, '$1'; pp(\@INC)'
0 голосов
/ 16 января 2012

Вы можете использовать команду instmodsh: http://perldoc.perl.org/instmodsh.html.

0 голосов
/ 04 декабря 2008

Module :: Mapper позволяет пройтись по дереву @INC, чтобы найти модули:

perl -MModule::Mapper -MData::Dumper \
-e 'print Dumper( find_sources( UseINC => 1, Modules => [ @ARGV ] ) )' \
list-of-modules-to-locate
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...