perl cgi脚本的环境变量

时间:2010-12-16 06:06:02

标签: perl include-path

我有一个类似于以下内容的cgi脚本:

BEGIN {
    unshift (@INC, "$ENV{'HOME'}/www/cgi-bin/SiteSpecific");
}

print "Content-type: text/html\n\n";
use SiteObject;
my $siteObjInst = SiteObject->instance();
print $siteObjInst->{HideFields};

这可以从命令提示符运行良好,但在从浏览器作为CGI脚本运行时失败。由于脚本无法找到模块,因此可能未设置$ ENV {'HOME'}。

是不是CGI脚本不在shell中运行而且找不到环境变量?

如果以上情况属实,我是否需要使用其他方法在BEGIN块中设置所需的变量?

感谢您的帮助。

3 个答案:

答案 0 :(得分:4)

CGI程序将由Web服务器设置其环境。可以设置或不设置HOME,具体取决于Web服务器的设置方式,如果设置了它,它可能会指向运行Web服务器的用户的主目录,而不是您的主目录。

您可以从CGI程序打印$ ENV {HOME}的值,甚至更好,打印整个%ENV哈希以查看实际发生的情况。

根据我的经验,最好是硬编码额外库的完整路径或在外部设置路径(例如使用PERL5LIB)。如果您是从程序内部设置它,请使用“lib”编译指示而不是直接修改@INC:

use lib '/home/user/www/cgi-bin/siteSpecific';

答案 1 :(得分:1)

您绝对无法保证您的shell和运行Web服务器的ID具有$ENV{HOME}的相同变量。暂时忘掉所有代码,试试这个:

print "Content-type: text/html\n\n";
print  q[<html><head><title>A Page</title></head>]
    . qq[<body><h1>\$HOME=$ENV{HOME}</h1></body></html>]
    ;

甚至这个:

use strict;
use warnings;
use CGI;

my $q = CGI->new;
print $q->header
    , $q->start_html( 'A Page' )
    , $q->start_table
    , $q->Tr( $q->th( 'Name' ), $q->th( 'Value' ))
    , ( map { $q->Tr( $q->td( $_ ), $q->td( $ENV{$_} )) } sort keys %ENV )
    , $q->end_table
    , $q->end_html
    ;

答案 2 :(得分:1)

有关一些问题和潜在答案的列表,我将从How can I troubleshoot my Perl CGI script?开始。