• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Perl オープン関数について)

Perl オープン関数について

このQ&Aのポイント
  • Perlのオープン関数についての疑問と、test.cgiとbbstest.cgiの動作の違いについて質問しています。
  • test.cgiとbbstest.cgiで使用されているオープン関数の挙動について疑問があります。
  • test.cgiとbbstest.cgiのオープン関数の使い方に関して、書き込み内容の位置が異なる理由について質問しています。

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

  • ベストアンサー
回答No.2

> test.cgiは、事前の@DATAが空なので 上の1-2)の下に下に追加 > bbstest.cgiは、事前の@DATAにデータがあるので、上の 2-1)の上に上に挿入 > の状態なのでしょう。 あっと 失礼いたしました。反対ですね。 test.cgiは 事前に@DATAに既存データが入っていてそれに unshiftで先頭に挿入されているので open の > で 上書きしても上に上にと挿入している状態。 一方 bbstest.cgiは 空の@DATAにunshiftでデータを挿入しているので@DATAには一行ぶんのデータしかないので open で >としたのでは過去データが消えるので open で>> で既存ファイルの最後に 下に下にと 追記している状態。 ということでしょう。

perlhogehoge
質問者

お礼

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

その他の回答 (1)

回答No.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)の上に上に挿入 の状態なのでしょう。

perlhogehoge
質問者

お礼

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

関連するQ&A