2011-06-15 102 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