- ベストアンサー
ログファイルを編集する方法はありませんか?
- cgiログファイルを読み出して特定の行数を入れ替える方法を教えてください。
- 素人でも分かりやすくログファイルを編集する方法を教えていただければ助かります。
- ログファイルの例を参考に、任意の行を入れ替える手順を教えてください。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
ログファイルというと通常は追記していくイメージがありますが、ここで書いてある操作はそれとはちょっと違いますね。 テキストに保存したデータ列といった感じでしょうか。 試しに書いたプログラムはこんな感じです。 use strict; use Fcntl qw(:flock); sub swap_lines { my ($lines, $index0, $index1) = @_; my $tmp; $tmp = $$lines[$index0]; $$lines[$index0] = $$lines[$index1]; $$lines[$index1] = $tmp; } my $filename = "program_data.txt"; my $fh; open($fh, "+<$filename") or die "cannot open $filename"; flock($fh, LOCK_EX); my @lines = <$fh>; swap_lines(\@lines, 0, 3); # write the lines to the file. truncate($fh, 0); seek($fh, 0, 0); print $fh @lines; close($fh); ちなみに、swap_linesではlinesの参照(\@lines)を渡すことで、swap_linesで値を入れ替えたのが呼び出し元で反映されるようにしています。 データを破壊しないためにファイルロックを取ります。なお、closeがアンロックするので明示的なアンロックは不要です。close直前にLOCK_UNするという間違いが多いですが、それをやるとプログラムのキャッシュに乗ったデータがファイルに反映される前にアンロックされる可能性があり、次にopenを読んでいたプログラムがそこが反映されていないデータを読む可能性があります。
お礼
お返事が遅くなって申し訳ございません。 丁寧にご説明いただき、ありがとうございます。 上記、試してみた所、行数1と行数4が入れ替え出来ました。 続けてご質問させて頂きますが、任意の数字で入れ替える場合はどのようにしたら良いでしょうか? [例] [ ]と[ ]を入れ替えるというフォームで、[ ]に数字を入れると入れ替えるという感じが理想なのですが・・・ お手数とは存じますが、よろしくお願い致しますm(__)m