我有一组具有相同名称但值不同的单选按钮。我正在尝试获取所选单选按钮的值,并将其与预设值进行比较,以查看它们是否匹配。
<input type="radio" name="one" value="a">
<input type="radio" name="one" value="b">
<input type="radio" name="one" value="c">
提交此表格......
修改
@answers = ("a", "a", "c");
for $key (param()) {
$input {$key} = param($key);
if ($key ne "firstName" and $key ne "lastName") {
$value = "$_\n" for $input{$key};
#The below values print out correctly.
#a a
#a a
#c c
print $value . " " . $answers[$i] . "<br/>";
#When trying to compare them nothing happens.
if ($value eq $answers[$i]) {
print "TEST<br/>";
$avg += 1;
}
$i++;
}
}
所以我需要将单选按钮的值压入我的数组,然后将其与数组答案进行比较。
答案 0 :(得分:0)
1)你总是使用换行符来换取$ value,但@answers中的值都没有。所以这永远不会匹配。
2)您假设您将按特定顺序获取值。有一天你会得到一个不同的订单,或者一个问题将被省略。然后你将比较例如问题1回答2.
3)如果同一参数有多个值(通常只是复选框的问题),则会丢失一些值。你的"$_\n" for $input{$key};
暗示这是一个合理的担忧。但是您将param()和存储调用到散列中是在标量上下文中,这将始终丢弃其他值。您需要使用列表上下文(例如@values=param($key); $item{$key}=[@values]
),但这需要在其他地方进行额外的工作来检查每个值,无论它是标量还是列表引用。
答案 1 :(得分:0)
您可以ask for the values of a specific parameter,因此无需将它们存储在单独的哈希中。
my @values = param("one");
然后使用smart match进行比较很简单。
use v5.10;
if( @values ~~ @answers ) {
...they matched...
}
最后一个难题是将答案存储在散列中,其中键是其参数。
my %correct_answers = (
one => ['a', 'a', 'c'],
two => [1,2,3],
);
然后,不是循环遍历所有参数并提取那些不是答案字段,因为谁知道用户将发送的其他内容(是的,用户可以按照他们想要的任何顺序向CGI程序提供他们想要的任何字段),你循环遍历%correct_answers
的键,以确保只查看你期望的字段。
for my $key (keys %correct_answers) {
my $correct_answer = $correct_answers{$key};
my @answer = param($key);
if( @answer ~~ @$correct_answers ) {
...they matched...
}
}