2012-07-25 106 views
1

我有一个HTML表单,它以数组的形式将复选框值发送到Perl CGI脚本。但是,由于该网站主要是使用PHP重新构建的,因此复选框数组的处理方式不同。我有一个返回表单的PHP函数。它看起来是这样的:perl cgi无法打印php复选框数组中的元素

<td>Profiles: </td> 
<td><input type=\"checkbox\" value=\"oneconnect\" name=\"v1-profile[]\">OneConnect <br /> 
<input type=\"checkbox\" value=\"http\" name=\"v1-profile[]\">HTTP <br /> 
<input type=\"checkbox\" value=\"xforwardedfor\" name=\"v1-profile[]\">Xforwarded-for</td> 
</tr> 

我再发这一个Perl CGI脚本

use CGI qw(:standard); 
my $q = new CGI; 
my @profiles1 = $q->param("v1-profile"); 

当我尝试打印数组的元素,我只看到“阵列”为输出。

foreach my $r (@profiles1) { 
print "$r\n"; 
} 

我也尝试了一些不起作用的东西。

foreach my $r (@profiles1) { 
foreach my $v (@$r) { 
print "$v\n"; 
} 
} 

如何访问“@ profiles1”数组的元素?感谢您的帮助!

+0

你是否看到类似'ARRAY(0x27967ac)'?这与'Array'不同,意味着你有一个只需要解引用的数组引用。 – Borodin 2012-07-26 09:04:59

回答

2

变量名后面的[]是一个PHP-ism--它不是标准的,并且不被Perl的CGI模块(或者除PHP以外的其他任何东西)专门处理。如果可以,请将其从表单中移除。如果没有,您应该可以通过在名称中包含括号来获取Perl参数:

my @profiles = $q->param("v1-profile[]"); 
+0

谢谢你的回复。当我从PHP窗体中删除“[]”时,CGI脚本确实起作用。但是,如果您选择多个复选框,则只会看到1个元素发送到CGI脚本。我需要多个复选框。正如你所建议的,我也尝试在参数名称中加入“[]”,但这不起作用。 (我当时甚至没有看到“Array”输出,再次感谢这个建议 – dars33 2012-07-25 23:31:26

+0

@ dars33 - 这个和你原来的代码看起来都是在列表上下文中得到的,所以它应该给你所有选中的复选框的值。 – Quentin 2012-07-26 08:47:16

1

不知道你的问题是什么。它似乎为我工作得很好。这是我制造的小测试台。

的test.html:

<html> 
    <head> 
    <title>Test</title> 
    </head> 
    <body> 
    <h1>Test</h1> 
    <form action="/cgi-bin/form"> 
     <table> 
     <tr> 
      <td>Profiles: </td> 
      <td><input type="checkbox" value="oneconnect" name="v1-profile[]">OneConnect <br /> 
      <input type="checkbox" value="http" name="v1-profile[]">HTTP <br /> 
      <input type="checkbox" value="xforwardedfor" name="v1-profile[]">Xforwarded-for<br /> 
      <input type="submit"></td> 
     </tr> 
     </table> 
    </form> 
    </body> 
</html> 

的cgi-bin /形式:

#!/usr/bin/perl 

use strict; 
use warnings; 
use CGI; 

my $q = CGI->new; 

print $q->header(-type => 'text/plain'); 

my @profiles = $q->param('v1-profile[]'); 

foreach (@profiles) { 
    print "$_\n"; 
} 

我看看到底是什么我的期望。我检查的每个复选框都显示在输出中。

有一点要检查。提交表单后,您的网址看起来像什么?我看起来像这样(有两个复选框选中)。

http://localhost/cgi-bin/form?v1-profile%5B%5D=oneconnect&v1-profile%5B%5D=xforwardedfor 

请注意,输入名称中的方括号已被URL编码。这就是应该发生的事情。

所以问题是,这与您的设置有何不同?