- ベストアンサー
ランダムに1行読込み フォーム文字との同異を 判定するには?
txt ファイル から ランダムに 1行読み込んで それが フォームの入力文字と同じかを 判定し、 同じならば、次のファイルへ飛ぶ には、 どうしたらよいのでしょうか? お教えください。 ------------------------------------------------------ mondai.txt に 問題を 1行に 1題ずつ kotae.txt に 解答を 1行に ひとつずつ 書きました。 mondai.txt の 1行目の 解答が kotae.txt の 1行目 (2行目-10行目、同じ)としました。 001.cgi で 正解すれば 002.cgi を開く 不正解なら もう一度 001.cgi を実行。 問題は ランダムに 表示する。 まず、mondai.txt と kotae.txt を それぞれ 10行にして やってみました。 ------------------------------------------------------ すると、問題は ランダムに表示されました。 しかし、 ##################################################### if (param('answer') eq ("$ans")){ print "Location:$num2.cgi\n\n"; ・・・ { ##################################################### が、うまくいきません。 ↓こうしてあります。どうしたら、よいでしょうか? ↓解答したことを file.txt に記録しよう、ともしています。 ↓ ################ はじめ ############################## #!/usr/bin/perl -T use strict; use warnings; use CGI qw(-debug :standard); my ($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst) = localtime(time); $year += 1900; $mon = sprintf("%02d", $mon + 1); $day = sprintf("%02d", $day); $hour = sprintf("%02d", $hour); $min = sprintf("%02d", $min); $sec = sprintf("%02d", $sec); my $num = ('1267'); my $num2 = $num + 1; my $value = param('answer'); open(FILE, "../../mondai.txt"); my @data2 = <FILE>; close(FILE); open(FILE, "../../kotae.txt"); my @data3 = <FILE>; close(FILE); my $i = int(rand(10)); my $ans = $data3[$i]; if (param('answer') eq ("$ans")){ print "Location:$num2.cgi\n\n"; open(FILE, '<+file.txt') or die "$!"; my @DATA = <FILE>; close(FILE); open(FILE, '>file.txt') or die "$!"; print FILE ("$num,$ans,$year年$mon月$day日 $hour時$min分$sec秒\n"); print FILE (@DATA); close(FILE); } else { print header(-charset => 'Shift_JIS'); print start_html("$num.cgi"); print ('<font face="century">'); print $data2[$i]; #####---問題表示 print br; print startform( -method => 'POST', -action => "$num.cgi" ); print blockquote( textfield( -name => 'answer', -size => '70', -id => "next", -accesskey => '[' ) ); print <<END; <script type="text/javascript" language="JavaScript"> document.getElementById('next').focus(); </script> END print submit(-value => 'Send ( ↑Alt+[ )'); print endform; } ################ おわり ############################## よろしく、お願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
もう回答がいくらか出ているので細かいことは言いませんが、以下のことも確認してみてください。 ファイルから読み取ったデータには、各行の最後に「\n」(改行)が入っていたりします。 (フォームの回答「aaa」とファイル内の解答「aaa\n」はeqにはなりません) if文のところをこんな風にいじってみてください if (param('answer') eq $ans){ ↓ if (param('answer')."\n" eq $ans){ もしくは if (param('answer') eq chop($ans)){ 改行コードが\nであること前提の話ですが以上です。
その他の回答 (2)
- tamahiro22
- ベストアンサー率44% (8/18)
簡単にしかコードを読んでいないのですが、 どうも気になる点があったので回答します。 やりたい事は、別々のファイルに記述された問題と答えを、 ランダムで1問読み込んで解答の判定をしたいということですね。 まず、最初に実行した時に、 $i に乱数が入ります。そして、それを元に問題が出されます。 そして、答えを入力して送信していますね? しかし、答え合わせをする為に、送信した時に、 また、$i に乱数が作られているので、 問題番号と解答番号が一致しておりません。 これでは、正しい答えを入力しても、 10回に1回しか正解になりません。 答えを送信する時に、一緒に問題番号を送信して、 答えは、その問題番号から引き出してくると良いでしょう。
お礼
ご親切なご指摘、ありがとうございました。
- sakusaker7
- ベストアンサー率62% (800/1280)
if の判定が期待通りできてないということですか? >if (param('answer') eq ("$ans")){ $ans のほうの末尾に改行がくっついてませんか? それから、この場合の$ansをダブルクォートで括る必要はありません。 >print start_html("$num.cgi"); とか >-action => "$num.cgi" もそうですね。
お礼
ご回答、まことにありがとうございました。
補足
ご回答、まことに、ありがとうございます。 はい、 if の判定が期待通りできてないということです。 問題が question-01 のとき 解答を answer-01 と フォームに書いても 1276.cgi のままで、 1277.cgi へ飛びません。 ----↑my $num = ('1267'); の時です。----- ありがとうございました。
お礼
ご回答、まことにありがとうございました。