use Fcntl; { my {$in,$out); sysopen $out, "$path/$fname.bak", O_WRONLY | O_CREAT | O_EXCL | O_EXLOCK or sleep 1 and redo; open $in, '<', "$path/$fname" or die $!; flock $in, LOCK_EX; while (<$in>) { # edit operations to modify or skip $_ print $out or die $!; } close $in; close $out or die $! rename "$path/$fname.bak", "$path/$fname" or die $!; }