2010-12-16 258 views
1

環境變量我有類似以下內容的CGI腳本:爲Perl 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塊內設置所需的變量?

感謝您的幫助。

回答

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 
    ; 
+0

我已經從你的答案中學到了很多東西。但是,我正試圖解決一個具體問題。 – rpat 2010-12-16 06:41:55

+0

試圖處理特定問題。我有一個服務器上的幾個網站。我擁有除了一個特定於每個域的模塊之外的所有站點通用的代碼。通用代碼利用特定的 – rpat 2010-12-16 06:48:06

+0

@rpat,這些變化都不會改變,以便知道您是否將正確的目錄推入「@ INC」,您需要知道服務器進程認爲「HOME」在哪裏 - 使用方法。 – Axeman 2010-12-16 06:55:00

3

CGI程序將有它的環境由Web服務器設置。根據Web服務器的設置方式,HOME可以設置也可以不設置,如果設置了,它可能會指向Web服務器運行的用戶的主目錄,而不是主目錄。

您可以從CGI程序中打印$ ENV {HOME}的值,或者甚至更好地打印整個%ENV散列以查看實際發生的情況。

根據我的經驗,它更好地硬編碼額外的庫的完整路徑或外部設置路徑(例如使用PERL5LIB)。如果你從程序中設置它,用「LIB」語法而不是直接修改@INC:

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