プロが教えるわが家の防犯対策術!

perl初心者です。
後ろの行を読んで、戻って、指定の行に、書き込む方法が、よくわかりません。

下記のようなファイルを読み込んで
----------------------------
アルファベット=
1A
2B
3C
アルファベット=
1A
2B
アルファベット=
1A
2B
3C
4D
5E
6F
------------------------------

下記のように、「アルファベット=」にアルファベットを入れるには、どうしたらいいでしょうか?
------------------------------
アルファベット=ABC
1A
2B
3C
アルファベット=AB
1A
2B
アルファベット=ABCDEF
1A
2B
3C
4D
5E
6F
--------------------------------

よろしくお願い致します。

A 回答 (4件)

後の行のデータを前の行の末尾に追加するには、1行毎の処理ができませんので、


一時的な配列を利用する等になるかと思います。以下は、簡単なコード例です。

use strict;
my @block = ();

while (my $line = <DATA>) {
if ($line =~ /^アルファベット/) {
print "$block[0]\n", @block[1 .. $#block] if @block;
chomp $line;
@block = ($line);
} else {
$block[0] .= substr($line, 1, 1);
push @block, $line;
}
print "$block[0]\n", @block[1 .. $#block] if eof;
}

__DATA__
アルファベット=
1A
2B
3C
アルファベット=
1A
2B
アルファベット=
1A
2B
3C
4D
5E
6F
    • good
    • 0

すでにあるファイルの末尾にデータ(文字)の追加はできますが、末尾以外への挿入は Perlの入出力機能では出来ません。



普通は、No.1さんのおっしゃる様にファイル全部を読み込んで変更してファイル全部を書き戻す処理になるでしょう。 処理速度を上げたいなら工夫の余地はありますが、プログラミングの初心者さんがトライすべきテーマでは無いと思います。
    • good
    • 0

> 後ろの行を読んで、戻って、指定の行に、書き込む方法


そのままのアルゴリズムで。

書き込むときに1行分のlengthを変数に取っておき、
書き直したい行を発見したらseekで戻る。
    • good
    • 0

とりあえずお手軽に処理するなら、



※メモリに全てを読み込んで処理をしたあと、メモリから元のファイルに上書きする。

って方法があります。最近のPCはメモリーも大きいですし、仮想記憶の機能もあるので、そうとう大きなファイルをメモリーで処理しても、問題ないでしょう。

なお、一発でうまくいくとは限らないので、とりあえず別ファイルに書き出し、OKになったらリネームする方法がいいかもしれません。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!