データファイルの更新方法についてなんですが、
 use POSIX;
 use Fcntl qw/:flock/;
 open my $fh, "+< $file" or die $!;
 flock $fh, LOCK_EX;
 my @data = <$fh>;
 # @dataの内容を加工
 truncate $fh, 0;
 seek $fh, 0, SEEK_SET;
 print $fh @data;
 close $fh;
という方法だと、truncate〜printの間にシグナルなどで死んだ時に
データが消えてしまいます。(実際にありました。)
そこで次のように変えることで、自分では対処できたと思っているのですが、
何か見落としなどはありますでしょうか?(今のところ正常に動いてはいます。)
 use File::Temp qw/tempfile/;
 # use POSIX〜@dataの加工まで同じ
 my ($tfh, $tfile) = tempfile(DIR=>$tmpdir);
 print $tfh @data;
 close $tfh;
 rename $tfile=>$file;
 close $fh;