Как я нахожу, какой Perl файла, загруженный, когда я использую модуль?

46
задан Daniel Böhmer 23 October 2014 в 10:25
поделиться

7 ответов

Да, %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",
}
71
ответ дан Brad Gilbert 26 November 2019 в 20:19
поделиться

Если модуль будет иметь документацию переходной приставки, и если можно гарантировать, что perldoc утилита в ПУТИ принадлежит тому же жемчугу, который выполняет сценарий, то эта команда будет часто давать Вам фактический находимый файл:

perldoc -l ModuleName
8
ответ дан skiphoppy 26 November 2019 в 20:19
поделиться

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

6
ответ дан brian d foy 26 November 2019 в 20:19
поделиться

Существует большое количество модулей в CPAN для нахождения этой информации, наиболее вероятные кандидаты надеются быть Модулем:: Найдите, Модуль:: Который, и Модуль:: Расположиться. Я, вероятно, пошел бы с Модулем:: Найдите:

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

my $to_find = "Some::Module";

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

В контексте списка определяют местоположение возвратов все найденные копии Некоторых:: Модуль в порядке на основе @INC.

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

4
ответ дан Community 26 November 2019 в 20:19
поделиться

Из того, что я нашел, жемчуг посмотрит в каталогах в пути:

perl -le 'print foreach @INC'

Тогда это посмотрит в стандартной библиотеке, и затем в текущем каталоге.

, Который дает Вам поисковое распоряжение.

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

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

1
ответ дан John 26 November 2019 в 20:19
поделиться

Модуль:: Картопостроитель позволяет обходить @INC дерево для нахождения модулей:

perl -MModule::Mapper -MData::Dumper \
-e 'print Dumper( find_sources( UseINC => 1, Modules => [ @ARGV ] ) )' \
list-of-modules-to-locate
0
ответ дан Hudson 26 November 2019 в 20:19
поделиться

Вот одна строка (с оберткой 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
ответ дан 26 November 2019 в 20:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: