[perl]任意のファイルの任意の行だけを効率よく変更する方法は?

[上に] [前に] [次に]
taka 2000/01/29(土) 23:58:11
 任意のファイルの任意の行だけを効率よく変更する方法を考えているんですが、スキル不足のため以下のようなアルゴリズムしか思いつきません。

open(IN,<"any.dat");
@arr=<IN>;
close(IN);
@arr[10]="any";
open(OUT,>"any.dat");
close(OUT);

 ご指摘お願いします。

Yosh 2000/01/30(日) 00:13:40
ちょっと任意のファイルってとこでは、意味合いが違うけど
DBMを使用してはどーでっかな、、、
上の例のような事をするなれば、
dbmopen(%arr, "any.dat",0606);
$arr{'10'} = "any"

こーすれば全件読む必要はないからスピードは望めるが
サイズが普通のテキストに比べて大きいのが難点かな

しなのむし 2000/01/30(日) 06:21:23
>open(IN,<"any.dat");
open(IN,"<any.dat");では?
# "<"は無くても良い。

>@arr[10]="any";
$arr[10]="any";では?

>open(OUT,>"any.dat");
open(OUT,">any.dat");では?

当然ですが、何も書き出さずに
>close(OUT);
してしまったら
any.datは空になっちゃいますよ。

taka 2000/01/30(日) 17:46:56
 失礼しました。
複数訂正いたします。

open(IN,"<./any.dat");
@arr=<IN>;            #ここが要領悪いなと思う点。
close(IN);
$arr[10]="any";       #例えば11行目だけを変更
open(OUT,">any.dat");
print OUT @arr;
close(OUT);

 

ふじ 2000/01/31(月) 04:16:53
$line = 0;
open(IN,"< any.dat");
open(OUT,"> any.dat.tmp");
while(<IN>){
    if ($line != 10){
        print "any";
    }else{
        print;
    }
    $line ++;
}
close(IN);
close(OUT);
rename "any.dat", "any.bak";
rename "any.dat.tmp", "any.dat";

こんな風にすれば、一度に配列に入れなくても処理できます。

taka 2000/02/01(火) 15:25:39
[[解決]]
>Yoshさんへ
 dbmopenをちょっと勉強しましたが、ちょっと扱いなと思いましたので、
もう少しスキルがつきましたら色々比較したいと思います.

>ふじさんへ
 このアルゴリズムはすんなり理解し,配列全体に呼び出す方法より
(ベンチはまだ調べてないんですが)効率がいいと直感的に
理解できました.
 ありがとうございました.

[上に] [前に] [次に]