perl cgi脚本的环境变量

perl cgi脚本的环境变量,perl,include-path,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}; 这在命令提示符下运行正常,但在浏览器中作为CG

我有一个类似于以下内容的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块内设置所需的变量


谢谢您的帮助。

您肯定不能保证您的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>]
    ;

您肯定不能保证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>]
    ;

CGI程序将由web服务器设置其环境。HOME是否设置取决于web服务器的设置方式,如果设置了HOME,则可能会指向web服务器作为用户运行的主目录,而不是您的主目录

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

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

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

CGI程序将由web服务器设置其环境。HOME是否设置取决于web服务器的设置方式,如果设置了HOME,则可能会指向web服务器作为用户运行的主目录,而不是您的主目录

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

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

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

对于一些问题和潜在答案的列表,我从开始。

对于一些问题和潜在答案的列表,我从开始。

我已经从你的答案中学到了很多。然而,我正在努力解决一个具体的问题。我在一台服务器上有几个网站。我有代码,这是共同的所有网站,除了一个模块,这是特定于每个域。公共代码使用specific@rpat,所有这些都没有改变,为了知道您是否将正确的目录推入
@INC
,您需要知道服务器进程认为“HOME”在哪里——使用上面的方法。我意识到我不能使用ENV部分。我有几个网站(在一台服务器上)使用通用代码。然而,公共代码反过来使用了为每个站点定制的模块(siteespecific.pm)。通用代码需要使用基于特定网站的include path来选择正确的siteespecific.pm。因此包含路径会有所不同。我想知道是否可以使用一些方法来设置BEGIN块中的include路径。很遗憾,我无法编辑web服务器文件。@rpat,您应该能够
使用lib
将路径取消移位到
@INC
。问题似乎在于你没有在列表中插入一条好的路径,而不是你不能在
BEGIN
块中调整include路径——因为你可以——我团队中的其他人对我的口味做得太多了。我已经从你的回答中学到了很多。然而,我正在努力解决一个具体的问题。我在一台服务器上有几个网站。我有代码,这是共同的所有网站,除了一个模块,这是特定于每个域。公共代码使用specific@rpat,所有这些都没有改变,为了知道您是否将正确的目录推入
@INC
,您需要知道服务器进程认为“HOME”在哪里——使用上面的方法。我意识到我不能使用ENV部分。我有几个网站(在一台服务器上)使用通用代码。然而,公共代码反过来使用了为每个站点定制的模块(siteespecific.pm)。通用代码需要使用基于特定网站的include path来选择正确的siteespecific.pm。因此包含路径会有所不同。我想知道是否可以使用一些方法来设置BEGIN块中的include路径。很遗憾,我无法编辑web服务器文件。@rpat,您应该能够
使用lib
将路径取消移位到
@INC
。问题似乎是您没有在列表中插入好的路径,而不是您不能在
BEGIN
块中调整include路径--因为您可以--我团队中的其他人对我的口味做得太多了。