Нахождение пути к модулю Perl при загрузке

#perl #module #path #environment

#perl #модуль #путь #Окружающая среда

Вопрос:

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

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

 import blah
print blah.__file__
  

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

Комментарии:

1. После сделанных мной записей мне интересно, как загружается файл? use или require ?

2. Он загружается как use .

Ответ №1:

 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 
предупреждения/register.pm
Exporter.pm 
vars.pm 
strict.pm
Список/util.pm 
warnings.pm

Комментарии:

1. К сожалению, у меня это не сработало; эта штука ничего не печатала, и я не могу понять почему.

2. если вы находитесь в Windows, и имя модуля похоже на второй случай :: вложенный, возможно, вам придется использовать » вместо ‘/’. Прочитайте perldoc perlvar для %INC получения дополнительной информации ( perldoc.perl.org/perlvar.html )

3. @Joel — Версии Perl для Windows используют ‘/’ в %INC , начиная как минимум с версии 5.6.

Ответ №2:

Чтобы расширить мой комментарий к ответу mob, попробуйте более свободно использовать %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 общими.

Ответ №3:

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

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

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