【问题标题】:How do I set Perl's @INC for a CGI script?如何为 CGI 脚本设置 Perl 的 @INC?
【发布时间】:2010-04-21 07:22:44
【问题描述】:

我有以下最简单的 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.

我确保已安装模板,并且确实在从 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 可以解决问题。

【问题讨论】:

  • 您说模板在@INC 中,但如果您在CGI 输出中读取@INC,您会发现它显然不是。

标签: perl module cgi


【解决方案1】:

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

 SetEnv PERL5LIB /path/to/your/libs

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

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

【讨论】:

    【解决方案2】:

    我建议将以下内容添加到您的 CGI 中

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

    PERL5LIB 环境变量可能对 CGI 程序不可用。

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

    【讨论】:

    • 哦,添加使用 lib "/home/pistacchio/lib/perl5/lib/i386-linux-thread-multi"
    • PERL5LIB 环境变量确实可用于 CGI 程序,只是不是您在用户帐户中设置的值。
    猜你喜欢
    • 2010-09-26
    • 2012-03-10
    • 2019-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多