我有一个html表单,该表单发送一个隐藏字段和一个具有相同名称的单选按钮。
这使人们可以提交表单而无需从列表中挑选(但记录为零答案)。
用户做选择单选按钮时,表单会同时发布隐藏值和所选值。
我想编写一个perl函数将POST数据转换为哈希。以下适用于标准文本框等。
#!/usr/bin/perl
use CGI qw(:standard);
sub GetForm{
%form;
foreach my $p (param()) {
$form{$p} = param($p);
}
return %form;
}
但是,当面对两个同名表单输入时,它只会返回第一个(即隐藏的)
我可以看到输入以数组的形式包含在POST标头中,但是我不知道如何处理它们。
我正在使用旧代码,因此很遗憾,我不能更改表格!
有没有办法做到这一点?
答案 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