处理以数组形式发送的POST数据

时间:2019-02-07 13:15:00

标签: perl cgi

我有一个html表单,该表单发送一个隐藏字段和一个具有相同名称的单选按钮。

这使人们可以提交表单而无需从列表中挑选(但记录为零答案)。

用户选择单选按钮时,表单会同时发布隐藏值和所选值。

我想编写一个perl函数将POST数据转换为哈希。以下适用于标准文本框等。

#!/usr/bin/perl
use CGI qw(:standard);
sub GetForm{
    %form;
    foreach my $p (param()) {
         $form{$p} = param($p); 
    }
    return %form;
}   

但是,当面对两个同名表单输入时,它只会返回第一个(即隐藏的)

我可以看到输入以数组的形式包含在POST标头中,但是我不知道如何处理它们。

我正在使用旧代码,因此很遗憾,我不能更改表格!

有没有办法做到这一点?

2 个答案:

答案 0 :(得分:3)

  

我有一个html表单,该表单发送一个隐藏字段和一个单选按钮,   相同的名字。

     

这使人们可以提交表单而无需从列表中选择   (但记录为零答案)。

这是一个奇怪的方法。忽略隐藏的输入,将不存在数据视为零答案会更加容易。


但是,如果您坚持使用自己的方法,请阅读the CGI module的文档。

具体来说,documentation for param

  

调用param()时如果参数是多值的(例如,从滚动列表中的多个选择中选择),则可以要求接收一个数组。否则,该方法将返回第一个值。

因此:

$form{$p} = [ param($p) ]; 

但是,您似乎确实在重新发明轮子。有一个built-in method to get a hash of all paramaters

$form = $CGI->new->Vars

话说,文档还说:

  

CGI.pm不再被视为开发Web应用程序(包括快速原型制作和小型Web脚本)的良好实践。目前,存在更好,更清洁,更快,更容易,更安全,更可扩展,更可扩展,更现代的替代方案。这些将记录在CGI::Alternatives中。

因此,您还是应该从此迁移。

答案 1 :(得分:0)

替换

$form{$p} = param($p);                             # Value of first field named $p

使用

$form{$p} = ( multi_param($p) )[-1];               # Value of last field named $p

$form{$p} = ( grep length, multi_param($p) )[-1];  # Value of last field named $p
                                                   # that has a non-blank value