Как прагма lib Perl работает?

Я использую use lib "./DIR" захватить библиотеку от папки в другом месте. Однако это, кажется, не работает над моим сервером, но это хорошо работает на моем локальном рабочем столе. Какие-либо конкретные причины?

И еще один вопрос, делает use lib быть распространенными в нескольких модулях?

Две ситуации: Скажите, что я делаю базовый класс, который требует нескольких библиотек, но я знаю, что он должен быть расширен, и расширенный класс должен будет пользоваться другой библиотекой. Я могу поместить use lib команда в базовом классе? или я должен буду поместить его в каждый расширяющийся класс?

Наконец, могу я просто иметь a use package где пакет содержит набор lib использования, он распространит операторы lib использования к моему текущему модулю? <-я не думаю так, но выяснение так или иначе

5
задан brian d foy 7 April 2010 в 17:41
поделиться

2 ответа

. в вашем операторе use lib означает «текущий рабочий каталог» и будет работать только тогда, когда ваш скрипт запускается из правильного каталога. Серверное представление о cwd, вероятно, отличается (или не определено). Предполагая, что каталог библиотеки совмещен со скриптом и является частным для него, вы хотите вместо этого сделать что-то вроде этого:

use FindBin;
use lib "$FindBin::Bin/DIR";

Оператор use lib влияет на @INC - список местоположений, которые выполняет поиск Perl, когда вы используете или требуете модуль. Это глобально влияет на текущий экземпляр интерпретатора. Вы действительно должны помещать операторы use lib только в сценарии, а не в модули.

В принципе, у вас может быть пакет MyLibs , состоящий из набора операторов use lib , а затем использовать MyLibs перед использованием любого из пакетов в эти места, но я бы не рекомендовал это.

3
ответ дан 14 December 2019 в 19:08
поделиться

Невозможно узнать, почему он не работает на вашем сервере, без дополнительной информации. В частности, проверьте журналы ошибок вашего сервера и, если необходимо, сделайте дамп @INC и сравните их с реальными путями к библиотекам.

use lib изменяет @INC , который является глобальным, поэтому, пока вы выполняете свою use lib до того, как другие пакеты попытаются включить что-то, он будет работать, и все другие пакеты увидят новые пути включения.

Подробнее о @INC см. Его запись в perlvar .

2
ответ дан 14 December 2019 в 19:08
поделиться
Другие вопросы по тегам:

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