my $changed; { open(my $fh_in, '<', $fn_in ) or die; open(my $fh_out, '>', $fn_out) or die; while (<$fh_in>) { if (...[ need to delete this line ]...) { $changed = 1; } else { print $fh_out $_; } if (...[ need to insert a line after this line ]...) { print $fh_out ...; $changed = 1; } } close($fh_in); close($fh_out) or die; } if ($changed) { rename($fn_out, $fn_in) or die; } else { # Preserve file's mtime. unlink($fn_out) or warn; }