2015-06-15 122 views
1

我發現了一個令人費解的行爲,使用perl cgi - 我猜 - 有一個完全有效的解釋,但我找不到一個。 關於stackoverflow有this問題,但它描述的似乎失敗了。 這種情況: 我有兩個perl cgi腳本。其中一個(比如script.pl)可以生成一個網站獨立,但也有一個參數,我們稱之爲BARE,以便它只會吐出非格式化的信息。從其他cgi腳本調用cgi腳本

#!/usr/bin/perl                                                     

use strict; 
use CGI; 

my $cgi = new CGI; 

unless (defined $cgi->param('BARE')) { 
    print $cgi->header, $cgi->start_html,$cgi->h1('Hello World'), $cgi->end_html; 
} else { 
    print "Bare"; 
} 

現在我想從另一個腳本調用此腳本與它的「裸裝」參數設置爲本地腳本(因爲它們是在同一目錄)(姑且稱之爲call_my_script.pl)。

#!/usr/bin/perl                                                     

use strict;  
use CGI; 

my $cgi = new CGI; 

my $result = qx(./script.pl "BARE=1"); 

print $cgi->header,$cgi->start_html,$result,$cgi->end_html; 

當在命令行中運行此腳本,我得到:

> ./call_my_script.pl 
Content-Type: text/html; charset=ISO-8859-1 

<!DOCTYPE html 
     PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US"> 
<head> 
<title>Untitled Document</title> 
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> 
</head> 
<body> 
Bare 
</body> 
</html> 

當,而不是我通過瀏覽器調用同一個腳本返回

<?xml version="1.0" encoding="iso-8859-1"?> 
<!DOCTYPE html 
    PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US"><head><title>Untitled Document</title> 
</head><body>Content-Type: text/html; charset=ISO-8859-1 

<?xml version="1.0" encoding="iso-8859-1"?> 
<!DOCTYPE html 
    PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US"><head><title>Untitled Document</title> 
</head><body><h1>Hello World</h1></body></html></body></html> 

所以,儘管我我正在使用qx在本地調用第一個腳本,並且我正在傳遞參數以獲得裸版格式,但在通過瀏覽器調用某些內容時這並不受尊重。

我可能忽略了一些明顯的東西,但我會很感激它明白它是什麼。

+1

工作環境以特定的方式。當您從另一個腳本調用它時,您是否設置了環境? – Jay

+0

@Jay我沒有做任何特定於環境的事情 – Erik

+2

@Erik FWIW將您希望分享給代碼的代碼提取出來並在兩個腳本中「使用」會好得多。 –

回答

4

CGI程序通常希望從環境變量QUERY_STRING中獲取參數值。在命令行上傳遞的參數值是一個調試工具,只有當程序從命令運行提示

你調用一個CGI腳本的Web服務器設置時可以嘗試這樣的事情

my $result = do { 
    local $ENV{QUERY_STRING} = 'BARE=1'; 
    qx{./script.pl}; 
}; 
+0

https://metacpan.org/pod/CGI#DEBUGGING可以打開和關閉,不限於實際的命令行。您也可以通過https://metacpan.org/pod/Capture::Tiny – optional

+0

@optional避開shell:我認爲將您的信息作爲另一種解決方案而不是簡單地譴責我的原因 – Borodin

+0

會更好嗎?我投票因爲無聊的評論...有一個味精,我應該評論,所以我做到了。答案已被接受。如果您刪除了「僅適用於...」的部分,我會更改我的投票。 「譴責」這個詞太強大了。有時我只是沒有獲得stackoverflow指導。 – optional