Как работает прагма lib Perl? - PullRequest
5 голосов
/ 07 апреля 2010

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 07 апреля 2010

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

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

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

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

2 голосов
/ 07 апреля 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...