タイトル

CGIの改造(中級編4)です。今回はファイル操作です。
普通のCGIはファイルに書き込んだり読み込んだりします。
これを知らないと掲示板を作れないということですね。


とりあえず読み込みましょうか。

open(IN,"text.log");
@line = <IN>;
close(IN);

まずは「open」でファイルを開けます。
その時についている「IN」ですが、ファイルハンドルと呼ばれるもので、
要するに、複数のファイルを同時に読み込む時に識別する名前ですね。
なまえのなので、かってに付けても問題ないです。(一般的には大文字を使いますけど)

次に@lineという配列に読み込んだtext.logを格納します。
この時、一行で1つの値となります。
例えば、「名前,メールアドレス,コメント」というのが一行だとすると、後でsplitを使い分割することになります。

最後に、開けたものは閉めましょう。ってことで、「close」で閉めます。

では実際に書きこむ場合はどうなるでしょうか。
書きこむ場合は2つあると思ってください。
一つは追記モード。
もう一つは普通に書き込みモード。
まずは追記モードから。


open(OUT,">>text.log");
print OUT @line;
close(OUT);

先ほどの読み込みと同じような感じなのですが、ビミョウに違います。
まずopenで開けることは同じですが、読み込むファイルの左に「>>」がついています。
(ファイルハンドルはどうでもいいです)
これが追記モードの合図です。
この状態でファイルを開け、書きこむよ〜と宣言しています。

次に「print」で書き込むよぉ〜と言っています。ファイルハンドルは正しいものにしないと書き込めません。当然。
追記モードで開くと、text.logの最後に@lineというものを追記する形になります。

最後にファイルを閉じます。

次は普通に書き込みモードです。


open(OUT,">text.log");
print OUT @line;
close(OUT);

普通に書き込むときは「>」です。
この時注意するのは、「open(OUT,">text.log");」として開けると、
text.logの中身はすべて消えるということです。
なので、あらかじめ読み込んで、配列に中身をいれてから開けないと、中身が消失します。

後は普通に書き込んで閉めます。

実際普通に書きこむほうが多いですね。
こんなやり方しますよという例を書いておきましょうか。


$file = 'text.log';

$name = 'aa';
$mail = 'aa@aa.aa';
$comment = 'あいうえお';

open(IN,"$file");
@line = <IN>;
close(IN);

unshift(@line,"$name,$mail,$comment,\n");

open(OUT,">$file");
print OUT @line;
close(OUT);

$file 一般的に使うファイルは変数にいれて置く
$name $mail $comment 掲示板などで取得するものと思ってください。
IN 中身を読み込んで、@lineの中に入れます。
unshift で@lineの一番上に文字列を入れます。
最後に「\n」で改行をいれます。これがないと一列になってしまうので。
OUT で、書き込みます。

こんな感じでわかったかなぁ?


当然のことながら、CGIの改造は各自の責任においてやってください。
いいこと以外は私は聞く耳持ちませんから。

表紙に行く