如何为CGI脚本设置Perl的@INC?

时间:2010-04-21 07:22:45

标签: perl module cgi

我有以下最简单的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,实际上从shell运行该程序时,它可以工作(加载模板)和输出:

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 个答案:

答案 0 :(得分:4)

我建议在CGI中添加以下内容

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

PERL5LIB env变量可能不适用于CGI程序。

编辑我的意思是,您在shell中在PERL5LIB中设置的任何值都不可用。

答案 1 :(得分:3)

网络服务器不会以您的用户身份运行,因此其环境不是您的用户环境。您可以根据您的网络服务器以多种方式进行设置。在Apache中,您可以使用SetEnv指令:

 SetEnv PERL5LIB /path/to/your/libs

然后适用于它下面的一切。例如,如果您将其存储在 .htaccess 文件中,它将应用于该目录下的所有内容。

如果您无法做到这一点,那么您就不会使用lib pragma在每个脚本中设置@INC的值。