WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:Perlでのファイル操作について

サンジ[MAIL][URL][WriteDate : Fri Oct 13 23:35:51 2000]

現在、Perlでの掲示板作成を試みているのですが、書込みをファイルに
書き出す方法がイマイチ理解できません。

解らないのは、最新の書込を先頭の行に書込む方法です。
このサイトの掲示板解説も読んだのですが、恥ずかしながら
解りませんでした。(^^;)

ASPはやっていたのですが、Perl歴2日程度なので出来るだけ
簡単にお願いします。m(_ _)m

Qz[MAIL][URL][WriteDate :Sat Oct 14 00:22:40 2000]

ファイルの先頭に書きこむ、ファイルのオープン方法はありません。
これは、どの言語にも言えることだと思います。
すくなくても、僕の知っている言語では、ないです。
ですから、先頭に書き出すための処理を自分で記述してあげなければいけません。

よく使われる方法としては、2つあるようです。
1.ファイルの中身をすべて、配列につっこんで、
その配列の先頭に、新しいデータを追加して、
ファイルに書きこむ方法。

2.テンポラリファイルを作成して、まず、新しいデータをそれにかきこみ、
そのあと、もともとのファイルの内容を書きこんでから、
テンポラリファイルを、もともとのファイルの名前に変更する方法。

ソース例

$newに新しいデータが入ってるとします。
最後に、\nが必要なら、あらかじめ入れておいてね。

1のソース例

open(IN, "data.txt");
@DATA = <IN>;
close(IN);

unshift(@DATA, $new);

open(OUT, ">data.txt");
print OUT @DATA;
close(OUT);

2のソース例
open(TMP, "data.tmp");
print TMP $new;
open(IN, "data.txt");
while(<IN>){
print TMP $_;
}
close(IN);
close(TMP);

--
while(<IN>){
print TMP $_;
}
の行の$_は略することができます。
print TMP while(<IN>);
でも可。




Qz[MAIL][URL][WriteDate :Sat Oct 14 00:25:04 2000]

あ、↑の2の例の最後に、
rename "data.tmp", "data.txt";
chmod 0666, "data.txt";
の行を入れ忘れました^^


わごな[MAIL][URL][WriteDate :Sat Oct 14 00:25:33 2000]

作成中のスクリプトのソースを見えるようにしてもらえると
具体的なアドバイスがもらえると、思いますよ

(私が見た限り)多くの掲示板のスクリプトでは
投稿ログを配列で処理しています
ですから、ファイル操作というより、配列の操作をすると考えれば
Perlには配列操作の各種関数があるので、そんなに、難しくないと思い
ます

まずは、出来あがってる掲示板のスクリプトを読んでみるのが近道だと覆いますヨ

わごな[MAIL][URL][WriteDate :Sat Oct 14 00:27:26 2000]

あ、Qzさんが先に・・・
あ、覆いますヨ ・・・思いますよの間違い・・・・(泣)


Qz[MAIL][URL][WriteDate :Sat Oct 14 00:33:37 2000]

補足
1と2どちらの方法がいいのか?
2のほうが、ファイルは死ににくいです。

1の方法だと、配列の内容をファイルに書き出すときに
CGIがなんらかの原因で終了した場合、
ファイルの中身が、最悪、消えてしまいます。
最悪じゃなくても、途中までしか、保存されていなかったりします。
同時実行によってファイルがしぬことよりも、こちらが原因でしぬことのほうが
多いような気がします。

2の方法だと、テンポラリファイルが死ぬだけで、
もともとのファイルは死にません。
リネームに失敗することは、あまり、ないので、
1に比較するとかなり安全なやりかたです。

データの保存量が多くなると予測されるなら、2のやりかたをおすすめします。


サンジ[MAIL][URL][WriteDate :Sat Oct 14 00:42:07 2000]

Qzさん、わごなさん、回答有り難うございました。

Qzさんの、1の方法で試してみます。

>まずは、出来あがってる掲示板のスクリプトを読んでみるのが近道だと覆いますヨ 

何個か見て、やり方が違うので、余計わからなくなりました。(^^;)
Perl言語の勉強不足なだけなんですが。
ソースは、ちょっと(大分かな?)恥ずかしくて・・・。
(現状は、試行錯誤中なんで見るに耐えないです)

しかし、Perlって言語は難しい、と言うか分かり難いです。
私にとっては、暗号的な命令が多い。
しかし、非常に短くプログラムを書けるのは中々いい所ですね。
(今は無理)

サンジ[MAIL][URL][WriteDate :Sat Oct 14 00:42:52 2000]

完了にするの忘れた・・・。
回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]