カンマ(,)が二個連続で続いたら、その行を削除してもとのファイルに戻すプログラム

use strict;
use warnings;
use autodie;
use File::Temp qw/ tempfile /;

my $infile  = "./file.txt";
my $outfile = "./file.txt";

my ($tmpfh, $tmpfile) = tempfile(UNLINK => 1);
open my $fh, "< $infile"; # sysopen is better
while (my $line = <$fh>) {
	next if $line =~ /,,/;
	# next if index($line, ',,') != -1; # is better
	print $tmpfh $line;
}
close $fh;
close $tmpfh;

rename $tmpfile, $outfile;
exit(0);
  • キモ
    • 書き換え中は一時ファイルに書き込む。途中でエラーしたり、SV落ちたりしたりなんかした時に中途半端なファイルが残るのを防ぐ。
    • sysopen使うのが良い。セキュリティ的な意味で。
    • 正規表現よりindex関数を使う。何万行とかになると差が出てくる。
    • 元ファイルをメモリに読み込まない。whileで回して読みながら一時ファイルに書く。何万行(ry
    • tempfileで開いたファイルハンドルは必ず閉じる。閉じないと書き込まれないことがある?
    • autodieを使う。手抜きなのかどうなのかわからなくなってる・・・
    • ちなみに上記ソースは空で書いたのでチェックしてない。。
    • あと、よく引っかかるんだけどファイルを読みながらそのファイルに書き込むというのはできない。"open > "ってしたらファイルが空になっちゃう。