use Fcntl qw(:DEFAULT :flock :seek); sysopen FH, "file.name", O_RDWR | O_CREAT or die "horribly - $!"; # no O_TRUNC!! flock FH, LOCK_EX or die "screaming - $!"; my @slurp = ; do_something_with(\@slurp); seek FH, 0, SEEK_SET; print FH @slurp; truncate FH, tell FH; close FH;