2011-06-15 99 views
2

我正在做一些開發工作,它使用嵌入式Linux作爲操作系統,Boa用於Web服務器。我有一個網頁發佈到CGI腳本,處理表單數據和回覆。我的開發環境是Ubuntu,並且一切正常,但是當我將代碼移植到嵌入式Linux時,CGI模塊沒有實例化(或者至少似乎沒有實例化)。這裏是我的代碼的精簡部分。 print聲明瞭一個未初始化的變量。Perl的CGI問題

use CGI; 

use strict; 
use warnings; 

my $cgiObj = CGI->new(); 

print $cgiObj->param('wlanPort'); 

再次,這在我的開發環境中工作正常,但在嵌入式環境中失敗。 CGI.pm已安裝,並且在CGI-> new()命令中沒有生成錯誤。我還驗證了表單數據正在發送,但顯然不能保證它正在被Perl腳本接收。

我有一種感覺,這是一個Boa配置問題,這就是接下來我將要研究的內容。我對Perl相當陌生,所以我不確定還有什麼要做。有任何想法嗎?

編輯:絕對不是一個博阿配置問題。仍在研究它。

更新: 我已經簡化我的代碼如下:

#!/usr/bin/perl 
use CGI qw(:standard); 
$data = param('wlanPort') || '<i>(No Input)</i>'; 
print header;        
print <<END; 
<title>Echoing user input</title> 
<p>wlanPort: $data</p>   
END 

正如預期的那樣,它打印(無輸入)

我還要指出的是,形式是ENCTYPE = 「multipart/form-data」,因爲我必須具有文件上傳功能,而且我正在使用「POST」方法。

我使用的是HttpFox插件來檢查後的數據,並檢查了wlanPort值:

-----------------------------132407047814270795471206851178 Content-Disposition: form-data; name="wlanPort"

eth1

所以它幾乎肯定被送到...

更新2:我安裝的是同一版本的Perl和Boa被用在我的Ubuntu筆記本電腦上的嵌入式系統中。在筆記本電腦上工作,而不是在設備上,這是相同的結果。我告訴我的僱主說,除了Boa和(Micro)Perl構建在設備上而非Ubuntu上的方式外,我已經耗盡了所有可能性。

+0

你能給出整個錯誤/警告信息嗎?另外,你確定'wlanPort'作爲參數被填充嗎?爲什麼不提取整個參數列表:$ params = $ q-> vars(),然後在前塊中用Data :: Dumper轉儲哈希值?然後你可以驗證這些參數是你期望的。 – DavidO 2011-06-15 20:01:20

+0

@Chris - 可能在對CGI對象進行實例化之前嘗試調用CGI :: initialize_globals()。 – dwarring 2011-06-16 06:50:23

+0

@DavidO唯一的錯誤我得到的是一個串聯的錯誤:() 在串聯或字符串中使用未初始化值在./setwirelessconfig.cgi線28 在第28行的代碼是這樣的: 打印「wlanPort-- >「。 $ cgiObj-> PARAM( 'wlanPort'); 由於我在嵌入式環境中有少量內存,因此我無法使用Data :: Dumper。我只能確定價值被張貼。 – 2011-06-17 00:19:03

回答

0

CGI是一個非常簡單的協議,雖然我不能直接回答你的問題,但我可以推薦一些技術來幫助隔離問題。

如果您的表單是通過POST提交的,那麼表單的內容將作爲URL編碼字符串顯示在腳本獲得的HTTP請求的內容中。如果不使用CGI模塊在所有的,你應該能夠讀取STDIN的請求:

my $request = ""; 
while (<STDIN>) { 
    $request .= $_; 
} 

if (open my $out, ">>/tmp/myapp.log") { 
    print $out $request; 
    close $out; 
} 

然後,您可以檢查/tmp/myapp.log看到,如果你是從該請求獲得的所有信息你認爲你是。

爲了完整起見,如果您的表單通過GET提交,那麼參數將位於環境變量QUERY_STRING中,您可以在Perl中使用$ ENV {'QUERY_STRING'}查看該變量。

CGI的對象接口和功能接口解析請求的方式應該沒有區別。我不熟悉boa,但我無法想象它打破了基本的CGI協議。

一個常見的問題是您命名錶單參數的一件事,並在CGI腳本中尋找不同的參數名稱。這總是笑。

祝你好運,希望這有助於一些。

+0

謝謝jjohn。數據正在發送,但沒有收到。由於代碼在我的開發環境中工作良好,我排除了我所有的錯字/腦筋痙攣類型錯誤。 我正在創建腳本作爲承包商。我向客戶展示他們在開發環境中工作,在失敗(在設備上)時向他們展示,向他們提供代碼,這是我從他們那裏聽到的最後一個。當我向他們展示失敗點時,他們開始注意到一些與我的東西無關的其他異常情況。 – 2011-08-31 19:51:06

+0

在某個時候,有人顯然打破了某些東西,並且影響了設備的其他部分,並且需要一段時間才能重新開始工作。 – 2011-08-31 19:54:16

+0

啊。 dev v。prod環境。我現在正在處理這些事情。祝你好運。 – jjohn 2011-09-02 11:15:56