2009-11-25 3 views
1
sh-3.2# perl -v 

This is perl, v5.8.9 built for darwin-2level 
... 


sh-3.2# perl 2348.pl 
Can't locate HTTP/Cookies.pm in @INC (@INC contains: /opt/local/lib/perl5/site_perl/5.8.9/darwin-2level /opt/local/lib/perl5/site_perl/5.8.9 /opt/local/lib/perl5/site_perl /opt/local/lib/perl5/vendor_perl/5.8.9/darwin-2level /opt/local/lib/perl5/vendor_perl/5.8.9 /opt/local/lib/perl5/vendor_perl /opt/local/lib/perl5/5.8.9/darwin-2level /opt/local/lib/perl5/5.8.9 .) at 2348.pl line 24. 
BEGIN failed--compilation aborted at 2348.pl line 24. 


sh-3.2# find/| grep -i "Cookies\.pm" 
/System/Library/Perl/Extras/5.10.0/HTTP/Cookies.pm 
/System/Library/Perl/Extras/5.8.9/HTTP/Cookies.pm 
/usr/local/ActivePerl-5.10/lib/HTTP/Cookies.pm 

как исправить это? Я понимаю, что мне нужно редактировать @INC, но где это? :)Как я могу заставить Perl найти мои модули?

+0

Вы находитесь на MAC ты? –

+0

Я думаю, вы имеете в виду «Mac», хотя это действительно не влияет на ответ. Это тот же ответ, что и в противном случае. –

+0

Извините, вместо MAC я должен был сказать «# $!%». –

ответ

3

Я думаю, вы должны попробовать

perl -I /System/Library/Perl/Extras/5.8.9 -e'use HTTP::Cookies;' 
+0

То же самое :( sh-3.2 # perl -I /System/Library/Perl/Extras/5.8.9 -e'use HTTP :: Cookies; ' sh-3.2 # perl 2348.pl Не удается найти HTTP/Cookies.pm в @INC (@INC содержит: /opt/local/lib/perl5/site_perl/5.8.9/darwin-2level /opt/local/lib/perl5/site_perl/5.8.9/opt/local/lib/perl5/site_perl /opt/local/lib/perl5/vendor_perl/5.8.9/darwin-2level /opt/local/lib/perl5/vendor_perl/5.8.9/opt/local/lib/perl5/vendor_perl/opt/local/lib/perl5/5.8.9/darwin-2level /opt/local/lib/perl5/5.8.9.) на линии 2348.pl 24. BEGIN failed - компиляция прерывается по линии 2348.pl 24. sh -3.2 # – yoble

+4

@yoble: Он означает, что вы должны использовать аргумент 'I ...' при вызове вашего скрипта. Команда verbatim, которую он дал вам, просто попытается использовать модуль, а затем выйти (поэтому, если это ошибки, вы можетескажите, что путь включения не работал). Так что 'perl -I/System/Library/Perl/Extras/5.8.9 2348.pl'. – Ether

0

@INC просто массив, который ссылается на ваш включает в себя, так же, как «путь» делает.

Попробуйте

do '/usr/local/ActivePerl-5.10/lib/HTTP/Cookies.pm' 

и использовать HTTP :: Cookies должны работать нормально.

Edit: Вы можете также узнать, что находится в @INC

$myincludes = join(", ",@INC); 
print $myincludes; 
+1

Да, я как-то бросился сюда. –

+0

sh-3.2 # do '/usr/local/ActivePerl-5.10/lib/HTTP/Cookies.pm ' sh: синтаксическая ошибка около неожиданного токена 'do' – yoble

+1

' do' - это функция perl, а не команда оболочки. –

0

Похоже, вы используете пользовательский скомпилированные Perl основе в «//локального отказа» директории. Две вещи для расследования: где вы работаете с Perl? Есть ли еще в /usr/bin? Я предполагаю, что система установлена ​​рядом с библиотеками, которые вы нашли, и с обычным, который вы используете (в этом случае вы можете использовать утилиту cpan для установки модуля, который вы хотите, в настраиваемое местоположение).

+0

/opt/local - где macports устанавливает свой материал (см. Http://macports.org); если '/ opt/local/bin' не находится перед'/usr/bin' в '$ PATH', вызовите'/opt/lang/bin/cpan HTTP :: Cookies'. – Ether

+0

О, какой беспорядок. Было бы полезно, если бы автор указал, что он использует программное обеспечение Apple. –

+0

Не имеет значения, что это на Mac OS X. Это та же проблема на любой платформе. –

5

Установлен HTTP::Cookies в нестандартном месте. Вы можете переустановить его с помощью cpan HTTP::Cookies или /opt/lang/bin/cpan HTTP::Cookies.

What's the easiest way to install a missing Perl module? Также см

+0

Эфир также рекомендует вызывать cpan с полным путем, потому что строка shebang должна иметь perl, который установил cpan. Посмотрите выходные данные, чтобы посмотреть, в какие каталоги вы вставляете их: в конфигурации CPAN.pm может быть указано что-то отличное от стандартного @INC. –

0

Вы не можете "редактировать" @INC. Он заперт в двоичном формате. (Да, есть некоторые установщики окон, которые заполняют значение @INC 500 NUL, чтобы они могли горячее исправление значения, но давайте не будем туда.)

Таким образом, единственный способ получить новое значение для @INC является перекомпиляция дистрибутива Perl.

+2

Это просто неверно. Я написал десятки сценариев с изменением @INC. –

+0

Нет, нет. Вы не изменили @INC, поскольку он связан в двоичном формате. –

+2

Чтобы уточнить: Рэндал говорит, что нет способа «настроить» путь @INC, который первоначально использовался исполняемым файлом perl. Он встроен в двоичный файл. Тем не менее, вы можете указать исполняемому файлу, что вы хотите искать в другом месте во время выполнения, используя ключи командной строки или код Perl, особенно для этого выполнения. Но вам придется делать это каждый раз, когда вы запускаете свой код, поскольку эти методы используются только для этого вызова. –

2

Вы можете редактировать @INC в сценарии:

BEGIN { 
    unshift(@INC, '/System/Library/Perl/Extras/5.8.9/'); 
    use HTTP::Cookies; 
} 

(Обновлено с предложениями от Брайан Д. Фой)

+2

Вероятно, вам нужен этот путь спереди, и обратите внимание, что он запускает Perl 5.8.9. Хотя это будет работать, поскольку HTTP :: Cookies - это чистый Perl, вы можете вызвать загрузку бинарного несовместимого модуля, просмотрев путь к библиотеке другой версии. –

Смежные вопросы