2012-07-25 59 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編碼。這就是應該發生的事情。

所以問題是,這與您的設置有何不同?