0

我有一组名称相同但值不同的单选按钮。我正在尝试获取所选单选按钮的值并将其与预设值进行比较以查看它们是否匹配。

<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++;
  }
}

所以我需要将单选按钮的值推送到我的数组中,然后将其与数组答案进行比较。

4

2 回答 2

0

1) 你总是在 $value 上添加一个换行符,但 @answers 中的值都没有。所以这永远不会匹配。

2)您假设您将按特定顺序获取值。有一天你会得到一个不同的订单,或者一个问题会被省略。然后,您将比较问题 1 和答案 2。

3) 如果同一参数有多个值(通常只是复选框的问题),您将丢失一些值。你的"$_\n" for $input{$key};暗示这是一个合理的担忧。但是您对 param() 的调用和您存储到哈希中的是标量上下文,这将始终删除其他值。您需要使用列表上下文(例如@values=param($key); $item{$key}=[@values]),但这将需要在其他地方进行额外的工作来检查每个值是标量还是列表引用。

于 2012-11-02T20:00:30.143 回答
0

您可以询问特定参数的值,因此无需将它们存储在单独的哈希中。

my @values = param("one");

然后使用智能匹配很容易进行比较。

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...
    }
}
于 2012-11-02T20:03:40.117 回答