http://www.perlmonks.org?node_id=49442


in reply to Re: The easiest way to substitute a part of the content of a file.
in thread The easiest way to substitute a part of the content of a file.

I like turnstep's editing the file in place, but it seems to me, if you're short on RAM, the best thing to do would be to rename the old file, open it to read and another to write.

rename $filename, $filename.".bak" or die "$!"; open(IN, $filename.".bak") or die "$!"; open(OUT, ">".$filename) or die "$!"; while (<IN>) { s/content/newcontent/g; print OUT; } close OUT; close IN;

Update

It sounds like the original poster is saying that "perl -p/n -i" won't work because this is a part of a larger program. Nevertheless, you make a good point tye. So I now propose:

open(IN, $filename) or die "$!"; open(OUT, ">".$filename.".new") or die "$!"; while (<IN>) { s/content/newcontent/g; print OUT; } close OUT; close IN; rename $filename.".new", $filename or die "$!";

You might even toss in a flock somewhere to try to guarantee exclusivity.

Replies are listed 'Best First'.
(tye)Re: The easiest way to substitute a part of the content of a file.
by tye (Sage) on Jan 03, 2001 at 07:04 UTC

    That is roughtly what tilly's "perl -pi" solution does. And I would discourage rewriting the existing file without renaming, that way lies nasty race conditions. Best to write a new file and rename it into place after you are done (you still have a race condition if you have simultaneious writers, but are in good shape in the more common case of a single writer and any number of readers).

            - tye (but my friends call me "Tye")