WEB相談室

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

タイトル:ファイルより一定期間経過後の行自動削除について

0:[投稿] TED2525 [MAIL] [2005/06/12 21:26 ][環境:IE6,WIN-XP UNIX]

こんにちは、始めまして。ファイルから一定期間経過後の行を自動削除する方法についてご指導ください。
あちこちサイトを見ながら、作っています。
ローカルタイム比較で60日経過以降の行を消したいのですが、どうしても消えません。
-----------------------------
#!/usr/bin/perl

my @new;
my $ok;

open(IN,"file.log");
while(<IN>){
    chomp();
    my $line = $_;
    /^(.*?)\,/;
    my $code = $2;
    $ok = 0;
    for(@new){
        if($code + 5184000 > $^T){
            $ok = 1;
            last;
        }
    }
    if(!$ok){
        push @new, $line;
    }
}
close(IN);

open(OUT,">file.log");
for(@new){
    print OUT $_,"\n";
}

ファイル(file.log)の配列は下記でタブ区切り、2番目にローカルタイムを記録しています。
「27eb6cdbf09df834a55a9592a01ce2db    1093788319    もしもし」


1:[回答] B-Cus [2005/06/12 21:48 ]

> /^(.*?)\,/;
対象データ内にカンマがないのでマッチしません。

> my $code = $2;
その前の m// にカッコが 1つしかないので $2 は undef です。
print デバッグすればすぐにわかることと思われます。

> (ひとつ目の) for(@new){
ここはなぜ @new でグルグルまわしているんですか?


2:[回答] TED2525 [MAIL] [2005/06/12 22:24 ]

添削ありがとうございました。
> /^(.*?)\,/;
>対象データ内にカンマがないのでマッチしません。

/^(.*?)\t/;
に修正しました。

> (ひとつ目の) for(@new){
>ここはなぜ @new でグルグルまわしているんですか?
for(@hash){
に修正しました。

> my $code = $2;
>その前の m// にカッコが 1つしかないので $2 は undef です。
この部分がわかりません。
自分で書いているスクリプトなんですが、正直消化しきれていません。


3:[回答] 通りがかり。 [2005/06/12 22:31 ]

>>2
の返事の意味が、まったく理解できません...
TED2525さんは、何をされたんですか?


4:[回答] TED2525 [MAIL] [2005/06/12 22:57 ]

いや、実は、上のスクリプトは、たまたま手元にあったルーチンを改造しているもので、私自身の知識は乏しいのです。
ただ掲示板などを改造したことがあったので、できる範囲でやっているということです。


5:[回答] B-Cus [2005/06/12 23:13 ]

- @hash はどこから出てきたんですか?
- if($code + 5184000 > $^T) の不等号は逆では。

> この部分がわかりません。
http://takenaka-akio.cool.ne.jp/doc/perl_kiso/reg_exp.html
「$1」で検索して、解説を読んでください。


6:[回答] 通りがかり。 [2005/06/12 23:49 ]

>>4
そういうことを聞いたんじゃなく…
B-Cusさんのように、書かないとダメだったのか…

http://www.amazon.co.jp/exec/obidos/ASIN/4774107557/250-2042960-5456220

こういう本を、一冊買われた方がよくないですか?
あなたが悩んでいること全部載ってますよ。


7:[回答] TED2525 [MAIL] [2005/06/13 06:00 ]

こんにちは、レスありがとうございます。

リファレンスを見ても理解不足でしたので、冗長ですが、下記で対応しました。ただ、美しくないですよね。
最初のもののようにコンパクトにしたかったのですが、自分には勉強不足でした。もう少しのように思えて悔しいです・・・

#!/usr/bin/perl

open(IN,"$file");
my @currentData = ();
while(<IN>){
    chomp();
    my %tmp = ();
    ($tmp{"SESSION"},$tmp{"TIME"},$tmp{"COM"}) = split(/\t/,$_);

    $NOW = $^T;
    $STIME = $tmp{"TIME"} + 5184000 ;

    if ($STIME > $NOW ){
    push @currentData, \%tmp;
    }
}
open(OUT,">$file");
for(@currentData){
    my %tmp = %{$_};
    print OUT join("\t",($tmp{"SESSION"},$tmp{"TIME"},$tmp{"COM"})),"\n";
}
close(OUT);


8:[回答] @ [2005/06/14 02:00 ]

自分だったらいちいち配列に突っ込まないで一時ファイルに書き出しながら、いらない行はスキップするってことで行きますけど。
最後はリネームでかぶせる感じで

> リファレンスを見ても理解不足でしたので、冗長ですが、下記で対応しました。ただ、美しくないですよね。
普通なのでは?

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World