Поиск пути к модулю Perl при загрузке - PullRequest
0 голосов
/ 03 мая 2011

Я использую устаревшее Perl-приложение, которое загружает библиотеку, называем это "бла". Мне нужно знать, где находится "бла" в моей файловой системе.

Я совсем не знаком с Perl, и мне интересно, каков эквивалентный способ печати пути к модулю вдоль строк специальной переменной __file__ в Python. Другими словами, Perl эквивалент следующего скрипта Python:

import blah
print blah.__file__

Большое спасибо.

Ответы [ 3 ]

7 голосов
/ 03 мая 2011
use blah;
print $INC{'blah.pm'};

use Blah1::Blah2::blah;
print $INC{'Blah1/Blah2/blah.pm'};


Дело значимо даже на Windows. use Blah создаст запись для $INC{'Blah.pm'}, а use blah создаст запись для $INC{'blah.pm'}.

C:\>perl -MList::util -e "print join $/, keys %INC"
XSLoader.pm
Carp.pm
warnings/register.pm
Exporter.pm
vars.pm
strict.pm
<B>List/util.pm</B>
warnings.pm
2 голосов
/ 03 мая 2011

Чтобы расширить мой комментарий к ответу моба, попробуйте более свободно использовать %INC, чтобы помочь вам:

#!/usr/bin/perl

use strict;
use warnings;

use blah;

foreach (keys %INC) {
  if (m'blah.pm') {
    print "$_ => $INC{$_}\n"; 
  }
}

Соответствующий perldoc perlvar по теме говорит

% INC

Хэш% INC содержит записи для каждого имени файла, включенного через операторы do, require или use.Ключ - это имя файла, которое вы указали (имена модулей преобразуются в пути), а значение - местоположение найденного файла.Оператор require использует этот хэш, чтобы определить, был ли конкретный файл уже включен.

Если файл был загружен через ловушку (например, ссылку на подпрограмму, см. Require для описания этих ловушек), эта ловушка по умолчанию вставляется в% INC вместо имени файла.Обратите внимание, однако, что ловушка, возможно, сама установила запись% INC, чтобы предоставить более конкретную информацию.

Если даже это не поможет, вы можете, как предлагает предыдущий документ, прочитатьо команде require, чтобы помочь вам понять, как она загружается в первую очередь.Это должно помочь вам справиться с этим, возможно, перебирая @INC, то есть папки, которые Perl будет искать для поиска файлов, которые будут require d.

0 голосов
/ 03 мая 2011

I нашел следующий однострочный , который решил мою проблему:

$ perl -MList::Util -e'print $_ . " => " . $INC{$_} . "\n" for keys %INC'

, где -MList::Util обозначает модуль List::Util (в моем случае я использовал -MBlah)

...