2012-11-02 112 views
0

我有一組單選按鈕,名稱相同但值不同。我試圖獲得所選單選按鈕的值並將其與預設值進行比較,看看它們是否匹配。比較Perl中輸入元素的值

<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

僅供參考,該語言被稱爲[Perl的](http://perldoc.perl.org/5.12.3/perlfaq1.html#What's-the-difference-between-%22perl%22-and-% 22Perl%22%3f),而不是PERL –

+0

下次我會更加小心。 – Jeff

回答

0

1)你總是用換行符換成$值,但@answers中的值都沒有。所以這永遠不會匹配。

2)你認爲你會得到一個特定的順序值。有一天你會得到不同的訂單,或者一個問題將被忽略。然後你會比較問題1回答2.

3)如果您對同一個參數有多個值(通常只對複選框有問題),您將失去一些值。你的"$_\n" for $input{$key};意味着這是一個合理的關注。但是,將param()和你的存儲調用到一個哈希中是在標量上下文中,它總是會丟棄其他值。您需要使用列表上下文(例如@values=param($key); $item{$key}=[@values]),但這需要額外的工作來檢查每個值是否是標量或列表引用。

+0

數字1是問題所在。感謝您指出了這一點。你也提出了關於第2點的好處。我也會解決這個問題。 – Jeff

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... 
    } 
} 
+0

我忘記了Perl有PHP沒有的運算符。謝謝您的幫助。 – Jeff