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


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

Thank you for pointing that out :)

Unfortunately, Tilly, it's a program that needs to run more than once and is quite large. I didn't know that was possible though :).

Turnstep, it is indeed at the end of a file. Your example doesn't deviate much from my solution save for the fact that it doesn't put all that crap before the part to be substituted in memory. With 12 MB of RAM (edo!) in a crappy old machine I ought to replace it's quite important ;].

Anyways, thanks go to both of you.

  • Comment on Re: The easiest way to substitute a part of the content of a file.

Replies are listed 'Best First'.
Re: Re: The easiest way to substitute a part of the content of a file.
by eg (Friar) on Jan 03, 2001 at 06:42 UTC

    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.

      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")