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

CGIかなりの初心者です。
infoseek iswebでcgi-lib.plを使って、フォームからデータを取得してテキストファイルに保存してまたそのファイルから読み込んで表示するだけのプログラムを作っているのですが、アクセスするたびにテキストファイルが空になってしまいます。以下のソースなのですが、間違いを指摘していただけないでしょうか?
尚、ひとまず、フォームの項目は3つあり、そのうちの最後だけが0か1か選択でき、他は0しか選択できないようにしています。

#!/usr/bin/perl

require "cgi-lib.pl";

print "Content-type: text/html;\n\n";

# 値をテキストファイルから読み込む
open (IN,"test.txt");
$aaa = <IN>;
close (IN);

$h = substr($aaa,0,1);
$i = substr($aaa,1,1);
$k = substr($aaa,2,1);

print "
<html>
<head>
<title>テスト</title>
</head>
<body>
$h$i$k

<br>
<form method=\"post\" action=\"test.cgi\">
データ1<br><input type=\"radio\" name=\"h\" value=\"0\" checked=\"checked\">0<br>
データ2<br><input type=\"radio\" name=\"i\" value=\"0\" checked=\"checked\">0<br>
データ3<br><input type=\"radio\" name=\"k\" value=\"0\" checked=\"checked\">0<br>
<input type=\"radio\" name=\"k\" value=\"1\">1<br>
<input type=\"submit\" value=\"送信\">
</form>
";

&ReadParse(*form);

# フォームの値を取得
$fh = $form{"h"};
$fi = $form{"i"};
$fk = $form{"k"};

# 値をテキストファイルに書き出す
@faaa = ("$fh","$fi","$fk");
open (OUT,"> test.txt");
print OUT @faaa;
close (OUT);

print "
</body>
</html>
";

A 回答 (3件)

詳細にといわれても?無いものは無いと言ってるだけなんですけど。


まずは %form の内容を表示してみたら?
それとも、ハッシュ配列の性質すら解ってない?掲示板で簡潔に説明するのは困難なので、まずは、入門書などで初歩の知識を得た上で、どのあたりが解らないのかを詳しく述べてみて下さい。

この回答への補足

「データがない~」というところの、何のデータがなぜないのかがわからないのです。

補足日時:2008/01/05 23:33
    • good
    • 0

実行順をよく考えて下さい。



初回実行
1. ファイル読み込み:先にファイルを作ってあれば、$h$i$kにデータが入る。
2. フォームデータの読み込み:まだデータはないので、$h$i$kはnullとなる、ハッシュ配列で定義されていないキーを指定してもperlではエラーは出ない。
3. 書き込み、データがnullなので、上書きモードだと消去になってしまう。

フォーム送信後
1. ファイル読み込み:null書き込み状態なので、$h$i$kにはデータが無い。
2. フォームデータの読み込み:$h$i$kに送信されたデータが入る。
3. 書き込み、送信データが上書きされる。

ということで、「# フォームの値を取得」のところは、送信データの有無チェックをしてから代入しましょう。

あと、「print "<html>..」の文字列が改行状態になってますけど、実際のプログラムでは、一行ですよね。でないとエラーになるはずだし?。
でも、こういうとき、ヒアドキュメントっていう便利な記述法があります。文字列を複数行に分けて書けて、2重引用符と一重引用符ともにエスケープしなくても記述できます。

print <<EOL;
<html>
<head>

<body>
$h$i$k
<br>
<form method="post" action="test.cgi">

</form>
EOL
    • good
    • 0
この回答へのお礼

回答ありがとうございます。まずヒアドキュメントを教えていただきありがとうございます。

CGIのほうですが、初回実行のところの2の「まだデータはない…」あたりがよくわかりません。詳しく教えていただけないでしょうか?すみません。

お礼日時:2008/01/04 17:14

ファイルを書き込む際のファイルオープン時に


open (OUT,"> test.txt");

としている箇所を、

open (OUT,">> test.txt");

とすれば追記書き込みとなり、ファイルの内容がクリアされることがなくなるかと想います。
perlは専門外なので、外していたらゴメンナサイ。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
しかし、追加書き込みだと前のデータが残ってしまうので、すべて書き換えたいのです。

お礼日時:2008/01/02 22:40

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