総ありがとう数 累計4,264万(2014年10月1日現在)

毎月4,000万人が利用!Q&Aでみんなで助け合い!

-PR-
kyonmimi2006

ホームページのカウンターで、アクセス解析をしたくてフリーのcgiカウンターに手を加えました。
そして、新しいログが、ファイルの先頭に来るよう下記のようにしました。

$tmp ="\nカウント : \[ $pcount \]\n日  時 : \[ $time \]\nホ ス ト : \[ $host \]\n\n";
open(DATA,"+<$logfile2") || &error;
@array = <DATA>;
@arr = splice(@array, 2030);
unshift @array, $tmp;
seek(DATA,0,0);
print DATA @array;
close(DATA);

以前、こちらのサイトで『新しいデータをファイルの先頭から表示させる方法』について質問させていただきました。
そして、unshift と seek を使った方法を教えていただきました。
ただ、データが多くなるとこの方法では、データが多くなると処理に時間がかかると教えて頂いた為、私は、ログが約90件を超えたら古いデータを消そうと思い、このようにしました。
しかし、『@arr = splice(@array, 2030);』この部分が良くないようで、データの一部が残ってしまうのです。

splice()の使い方について詳しく教えて下さい。
よろしくお願い致します。
  • 回答数2
  • 気になる数0

Aみんなの回答(全2件)

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

  • 2007-06-15 01:15:53
  • 回答No.2
> spliceは、splice(対象配列、削除の開始位置)ではないのでしょうか?
splice は 1~4個の引数を取ります。
2個の場合はその通りですね。

で、配列の中身は期待通りになっているけれども、ファイルはそうじゃないのでは?
ということです。
つまり、ファイルポインタを先頭までまき戻して、そこから配列の内容を書き出しましたが、
ファイルのサイズは変わっていないので、仮に元のファイルのサイズが
書き出したサイズより大きければゴミが後ろにくっつくことになります。

で、そのサイズの調整をするのが truncateです。
spliceと同じく組み込み関数ですので、調べてみてください。
お礼コメント
sakusaker7さん、ありがとうございました。

seek(DATA,0,0);
truncate(DATA,70000);
print DATA @array;
close(DATA);

としたら、うまくいきました。
始めは、truncateの部分とprint部分を逆に書いていましたが、
それではうまくいかず、上記のようにしたところうまくいきました。

どうもありがとうございました。
投稿日時 - 2007-06-15 13:54:47
  • 同意数0(0-0)
  • ありがとう数0

その他の回答 (全1件)

  • 2007-06-14 18:12:02
  • 回答No.1
90件を超えた分を消すというのと、spliceで指定している
2030という数字の関係がわかりません。
この2030の意味はなんですか?

openした後の処理を見ると多分2030行ということなんでしょうけど。

あるいはファイルに書き出してからcloseする前に
truncateを実行しとくとか。
補足コメント
sakusaker7さん、すみません。

90件ではなく、290件分でした。
$tmpに入れてあるデータが上記よりもう少しあり、7行分あるため、
2030としたのですが、2031行目以上のデータが、一部(一部の行の後半部分)が残っているのです。

spliceは、splice(対象配列、削除の開始位置)ではないのでしょうか?

truncateを実行とは?

ご指導、よろしくお願いします。
投稿日時 - 2007-06-14 19:05:11
通報する
  • 同意数0(0-0)
  • ありがとう数0
  • 回答数2
  • 気になる数0
  • ありがとう数0
  • ありがとう
  • なるほど、役に立ったなど
    感じた思いを「ありがとう」で
    伝えてください

関連するQ&A

その他の関連するQ&Aをキーワードで探す

別のキーワードで再検索する

あなたの悩みをみんなに解決してもらいましょう

  • 質問する
  • 知りたいこと、悩んでいることを
    投稿してみましょう
-PR-
-PR-
-PR-

特集

試写会に30組60名様をご招待!

親同士が気軽に情報交換できるコミュニティです。

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ