電子書籍の厳選無料作品が豊富!

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;
}
################ おわり ##############################
よろしく、お願いいたします。

A 回答 (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であること前提の話ですが以上です。
    • good
    • 0
この回答へのお礼

ご回答、まことにありがとうございました。

お礼日時:2008/05/01 05:58

簡単にしかコードを読んでいないのですが、


どうも気になる点があったので回答します。

やりたい事は、別々のファイルに記述された問題と答えを、
ランダムで1問読み込んで解答の判定をしたいということですね。

まず、最初に実行した時に、
$i に乱数が入ります。そして、それを元に問題が出されます。
そして、答えを入力して送信していますね?

しかし、答え合わせをする為に、送信した時に、
また、$i に乱数が作られているので、
問題番号と解答番号が一致しておりません。
これでは、正しい答えを入力しても、
10回に1回しか正解になりません。

答えを送信する時に、一緒に問題番号を送信して、
答えは、その問題番号から引き出してくると良いでしょう。
    • good
    • 0
この回答へのお礼

ご親切なご指摘、ありがとうございました。

お礼日時:2008/05/01 06:00

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'); の時です。-----

ありがとうございました。

補足日時:2008/04/21 17:53
    • good
    • 0
この回答へのお礼

ご回答、まことにありがとうございました。

お礼日時:2008/05/01 06:01

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!