#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
)