こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Perl オープン関数について

Perl オープン関数について

いつもお世話になっております。

オープン関数でわからないことがあるのでご教示お願い致します。


■test.cgi■
open(FILE, ">sled/$log") or die("error :$!");
eval{ flock(FILE, 2) };
print FILE @DATA;
close FILE;

■bbstest.cgi■
open(FILE, ">>sled/$loglog") or die("error :$!");
eval{ flock(FILE, 2) };
print FILE @DATA;
close FILE;

上記のtest.cgi側では「>」これが1個で書き込まれるのですが
bbstest.cgi側では「>」これ1つだけですと、すべての内容がリセット
され、その時入力した内容だけ残ります。

それを「>>」にすると追加はされるのですが、

test.cgi側では
上へ上へと内容は追加されていくのに対し

bbstest.cgi側では
下へ下へ追加されていきます。

書込方法は、両方共
unshift(@DATA,"$NO,$tm,$TITLE,$TEXT,$PASS,$IP\n");
このようにしているのですが、

なぜ、同じ処理で、書込方法がかわるのでしょうか?
目的は上へ上へがいいのですが。。。

投稿日時 - 2017-07-21 16:59:34

QNo.9354331

困ってます

質問者が選んだベストアンサー

> test.cgiは、事前の@DATAが空なので 上の1-2)の下に下に追加
> bbstest.cgiは、事前の@DATAにデータがあるので、上の 2-1)の上に上に挿入
> の状態なのでしょう。

あっと 失礼いたしました。反対ですね。

test.cgiは 事前に@DATAに既存データが入っていてそれに unshiftで先頭に挿入されているので open の > で 上書きしても上に上にと挿入している状態。

一方 bbstest.cgiは 空の@DATAにunshiftでデータを挿入しているので@DATAには一行ぶんのデータしかないので
open で >としたのでは過去データが消えるので open で>> で既存ファイルの最後に 下に下にと 追記している状態。

ということでしょう。

投稿日時 - 2017-07-22 12:59:27

お礼

ありがとうございます!
解決できました!

投稿日時 - 2017-07-25 14:49:39

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

問題は
unshift(@DATA,"$NO,$tm,$TITLE,$TEXT,$PASS,$IP\n");
とする前の@DATAの中身です。

1)
事前の@DATAが空の状態で
unshift(@DATA,"$NO,$tm,$TITLE,$TEXT,$PASS,$IP\n");
とすると、1行しかない@DATAが作られます。

1-1)
この状態で
open(FILE, ">sled/$log") or die("error :$!");
print FILE @DATA;
↑とすると、これはファイルの上書きなので
元のデータが消えて、1行だけのデータになってしまいます。

1-2)
これを、openで >>として
open(FILE, ">>sled/$loglog") or die("error :$!");
print FILE @DATA;
↑とすると、既存ファイルの後ろに追記を指定しているので
既存ファイルの最後に1行追加されます。
(下へ下へと追記されるファイル)


2)
いっぽう
@DATAに、既存のファイル内容が読み込まれた状態で
unshift(@DATA,"$NO,$tm,$TITLE,$TEXT,$PASS,$IP\n");
とすると、既存ファイルの内容の前に、一行が挿入された@DATAが作られます

2-1)
この状態で
open(FILE, ">sled/$log") or die("error :$!");
print FILE @DATA;
↑とすると、これは既存データの”上”に追加されたファイルが作られます。
(上へ上へ挿入)

2-2)
open(FILE, ">>sled/$loglog") or die("error :$!");
print FILE @DATA;
↑とすると、既存ファイルの後ろに追記なので
既存データ+追加される1行+もう一度既存データ
と多重データになってしまいます。


たぶん
test.cgiは、事前の@DATAが空なので 上の1-2)の下に下に追加
bbstest.cgiは、事前の@DATAにデータがあるので、上の 2-1)の上に上に挿入
の状態なのでしょう。

投稿日時 - 2017-07-21 18:43:43

お礼

ありがとうございます!
解決できました!

投稿日時 - 2017-07-25 14:49:11

あなたにオススメの質問