Как мне установить Perl @INC для CGI-скрипта? - PullRequest
1 голос
/ 21 апреля 2010

У меня есть следующий, самый простой Perl CGI-скрипт:

use strict;
use warnings;
use CGI();
use CGI::Carp qw(fatalsToBrowser);

use Template;

print CGI::header();

foreach(@INC) {
    print "$_\n";
}

При вызове (http://[..] / Cgi-bin / p.cgi ) мне выдается следующая ошибка:

Can't locate Template.pm in @INC (@INC contains: /usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.8 /usr/lib/perl5/site_perl /usr/lib/perl5/vendor_perl/5.8.8/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.8 /usr/lib/perl5/vendor_perl /usr/lib/perl5/5.8.8/i386-linux-thread-multi /usr/lib/perl5/5.8.8 .) at /home/pistacchio/webapps/htdocs/cgi-bin/p.cgi line 8.
BEGIN failed--compilation aborted at /home/pistacchio/webapps/htdocs/cgi-bin/p.cgi line 8.

Я убедился, что Template установлен, и действительно, при запуске этой программы из оболочки она работает (загружает Template) и выводит:

Content-Type: text/html; charset=ISO-8859-1

/home/pistacchio/lib/perl5
/home/pistacchio/lib/perl5/lib/i386-linux-thread-multi
/home/pistacchio/lib/perl5/lib
/home/pistacchio/lib/perl5/lib/i386-linux-thread-multi
/usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi
/usr/lib/perl5/site_perl/5.8.8
/usr/lib/perl5/site_perl
/usr/lib/perl5/vendor_perl/5.8.8/i386-linux-thread-multi
/usr/lib/perl5/vendor_perl/5.8.8
/usr/lib/perl5/vendor_perl
/usr/lib/perl5/5.8.8/i386-linux-thread-multi
/usr/lib/perl5/5.8.8

Шаблон установлен в /home/pistacchio/lib/perl5/lib/i386-linux-thread-multi

[pistacchio@web118 i386-linux-thread-multi]$ pwd
/home/pistacchio/lib/perl5/lib/i386-linux-thread-multi
[pistacchio@web118 i386-linux-thread-multi]$ ls
auto  perllocal.pod  Template  Template.pm

Этот каталог правильно указан в env и, как было ранее опубликовано, в @INC. В @INC он показывается дважды, поэтому я даже пытался выскочить перед вызовом use Template, но безрезультатно. От env:

[pistacchio@web118 i386-linux-thread-multi]$ env
[..]
PERL5LIB=/home/pistacchio/lib/perl5:/home/pistacchio/lib/perl5/lib:/home/pistacchio/lib/perl5/lib/i386-linux-thread-multi
[..]

Удаление use Template избавляет от проблемы.

Ответы [ 2 ]

4 голосов
/ 21 апреля 2010

Я бы предложил добавить следующее к вашему CGI

  use lib "/home/pistacchio/lib/" ;

Переменная env PERL5LIB предположительно недоступна для программ CGI.

Редактировать Что я имел в виду, любое значение, установленное вами в PERL5LIB из оболочки, будет недоступно.

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

Веб-сервер не запускается как ваш пользователь, поэтому его среда не является вашей пользовательской средой. Вы можете установить это различными способами в зависимости от вашего веб-сервера. В Apache вы можете использовать директиву SetEnv :

 SetEnv PERL5LIB /path/to/your/libs

Это относится ко всему, что под ним. Например, если он есть в файле .htaccess , он применяется ко всему в этом каталоге.

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

...