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

pis*_*hio 2 perl cgi module

我有以下最简单的 Perl CGI 脚本:

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

use Template;

print CGI::header();

foreach(@INC) {
    print "$_\n";
}
Run Code Online (Sandbox Code Playgroud)

当调用 ( 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.
Run Code Online (Sandbox Code Playgroud)

我确保安装了模板,并且确实在从 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
Run Code Online (Sandbox Code Playgroud)

模板安装在 /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
Run Code Online (Sandbox Code Playgroud)

该目录正确列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
[..]
Run Code Online (Sandbox Code Playgroud)

删除use Template可以解决问题。

bri*_*foy 5

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

 SetEnv PERL5LIB /path/to/your/libs
Run Code Online (Sandbox Code Playgroud)

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

如果你不能做这样的事情,你就会被困@INC在自己用lib pragma设置每个脚本中的值。