2010-04-21 56 views
1

我有以下,最简单的Perl CGI脚本:如何为CGI脚本设置Perl的@INC?

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. 

运行这个时,我确信,模板安装,确实程序从它的工作原理(加载模板)和输出:

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

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

此目录将在env正确列出,如前面贴,在@INC。在@INC中显示了两次,所以我甚至在拨打use Template之前试图将其弹出,但没有结果。从env

[[email protected] 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摆脱这个问题。

+1

你说Template是在@INC中,但是如果你在CGI输出中读到@INC,你会发现它显然不是。 – 2010-04-21 12:42:17

回答

4

我建议加入以下到您的CGI

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

的PERL5LIB环境变量大概是不提供给CGI程序。

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

+0

嗨,感谢您的输入,但没有任何变化 – pistacchio 2010-04-21 07:58:58

+0

哦,它工作添加使用lib“/ home/pistacchio/lib/perl5/lib/i386-linux-thread-multi” – pistacchio 2010-04-21 09:45:41

+2

PERL5LIB环境变量确实可用于CGI程序,这仅仅是您在用户帐户中设置的值。 – 2010-04-21 12:22:39

3

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

SetEnv PERL5LIB /path/to/your/libs 

然后这适用于它下面的所有内容。例如,如果您使用.htaccess文件,则该文件适用于该目录下的所有文件。

如果你不能做那样的事情,你可以用lib附注将你的值设为@INC