open( OLD, "<", $old ) or die "can't open $old: $!"; open( NEW, ">", $new ) or die "can't open $new: $!"; while () { # change $_, then ... print NEW $_ or die "can't write $new: $!"; } close( OLD ) or die "can't close $old: $!"; close( NEW ) or die "can't close $new: $!"; rename( $old, "$old.orig" ) or die "can't rename $old to $old.orig: $!"; rename( $new, $old ) or die "can't rename $new to $old: $!"; #### use Fcntl qw( :flock :DEFAULT ); sysopen( OUT, $out, O_WRONLY|O_CREAT ) or die "can't sysopen $out: $!"; flock( OUT, LOCK_EX ) or die "can't flock $out: $!"; truncate( OUT, 0) or die "can't truncate $out: $!"; # now write to file... close( OUT ) or die "can't close $out: $!";