-PR-

解決済みの質問

質問No.3084501
困ってます
困ってます
お気に入り投稿に追加する (0人が追加しました)
回答数2
閲覧数505
splice()の使い方について教えて下さい
ホームページのカウンターで、アクセス解析をしたくてフリーの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()の使い方について詳しく教えて下さい。
よろしくお願い致します。
投稿日時 - 2007-06-14 17:53:02

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

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

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

で、そのサイズの調整をするのが truncateです。
spliceと同じく組み込み関数ですので、調べてみてください。
投稿日時 - 2007-06-15 01:15:53
この回答を支持する
(現在0人が支持しています)
お礼
sakusaker7さん、ありがとうございました。

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

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

どうもありがとうございました。
投稿日時 - 2007-06-15 13:54:47

ベストアンサー以外の回答 (1)

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

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

あるいはファイルに書き出してからcloseする前に
truncateを実行しとくとか。
投稿日時 - 2007-06-14 18:12:02
この回答を支持する
(現在0人が支持しています)
補足
sakusaker7さん、すみません。

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

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

truncateを実行とは?

ご指導、よろしくお願いします。
投稿日時 - 2007-06-14 19:05:11
この質問は役に立ちましたか?
0人が「このQ&Aが役に立った」と投票しています
もっと聞いてみる

関連するQ&A

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

同じカテゴリの人気Q&Aランキング

カテゴリ
CGI
-PR-
-PR-

特集

背筋がゾクゾクする心霊体験を要チェック!

お城、ボート、ツリーハウス、ユニークな物件満載!

【期間限定】1ヶ月無料キャンペーン中!

同じカテゴリの人気Q&Aランキング

カテゴリ
CGI
-PR-

ピックアップ

-PR-