Почему Perl отладчик не может найти модуль, который находит скрипт? - PullRequest
0 голосов
/ 16 декабря 2010

Используя CPAN, я установил GD :: Graph для создания горизонтальных гистограмм. CPAN установил модули в /root/.cpan/build/GD-2.45-4PSn9K, которого нет в @INC. В моем скрипте я могу получить доступ к модулям, добавив

use lib "/root/.cpan/build/GD-2.45-4PSn9K"

Скрипт теперь генерирует графики без проблем. Я хотел использовать отладчик perl ("perl -d myscript.pl"), но он жалуется, что не может найти GD.pm (который находится на этом пути). Я добавил путь к PERL5LIB, проверенный с помощью «perl -V», но все равно отладчик не может его найти.

Возможно, один из способов обойти это - установить GD в один из путей @INC, но а) я не знаю, как это сделать, и б) я действительно хотел бы понять, что происходит.

Это на Fedora Core 12.

Я не знаю, имеет ли значение if, но GD :: Graph фактически используется в модуле, который включен в мой основной скрипт. Основной скрипт не использует его.

Обновление: следуя приведенным ниже советам, я повторно ввел CPAN и принудительно установил. CPAN сказал, что нашел установку в /root/.cpan/ (и т. Д.) И предварительно добавил этот путь к @INC. Затем я вручную удалил GD из каталога .cpan и снова начал установку. На этот раз CPAN поместил его в то же место, а также в /usr/local/lib/perl5/GD-2.45PSn9K ". Он добавил оба пути к @INC. Я убедился, что он есть, и отладчик perl утверждает искать там, но все еще не может найти GD.pm (который там ) и не будет запускать скрипт.

@INC:
 /usr/local/lib/perl5/GD-2.45-4PSn9K/
  (and others)

Из perl -d:

Can't locate loadable object for module GD in @INC (@INC contains:   

... и перечисляет этот путь среди других. Это действительно там:

[root /]# find . -name "GD.pm"
./usr/local/lib/perl5/GD-2.45-4PSn9K/GD.pm
./usr/local/lib/perl5/GD-2.45-4PSn9K/blib/lib/GD.pm
 (and the /root/.cpan paths)

Ответы [ 2 ]

1 голос
/ 16 декабря 2010

на bourne-совместимых:

export PERL5LIB=$PERL5LIB:/root/.cpan/build/GD-2.45-4PSn9K

Это не лучшее решение.Вы должны фактически установить это через cpan.Если он работает нормально и не устанавливается, возможно, вам потребуется force.

force install GD::Graph

И еще есть

perl -I/root/.cpan/build/GD-2.45-4PSn9K -d myscript.pl
0 голосов
/ 16 декабря 2010

Не используйте это местоположение - cpan, вероятно, скоро выбросит его (как Эрик упомянул в своем комментарии, это просто каталог сборки, и через некоторое время они будут удалены).

Есливы можете получить к нему доступ из своего скрипта без этой строки use lib, а другую (предположительно правильно установленную) версию можно найти по

use GD;
warn $INC{"GD.pm"};

или посмотреть пути @INC, чтобы увидеть потенциальные места, которые он может скрывать

warn join, "\n", @INC;

Уловка Snoopy perldoc lm тоже хороша, но она может быть не совсем точной, если в сценарии вы играете другие вещи с @INC.

Если вам это нужно use libчтобы заставить его работать в версии скрипта, то, вероятно, он не был установлен должным образом, поэтому предложение Axeman force install могло бы стоить того (и это должно сказать вам, куда он помещает файлы).

...