in reply to Replacing a string in a file

Why bother with the temp file? You can open a file for reading and writing at the same time. This will be quicker and require much less code.

Replies are listed 'Best First'.
Re: Replacing a string in a file
by perlplexer (Hermit) on Jul 16, 2003 at 17:14 UTC
    The amount of code required to accomplish this task depends greately on what kind of file he's dealing with. Using one file instead of two is not always simpler/easier to code.

    If files that you're dealing with are small; i.e., config files, etc., it's probably easier to slurp them into memory, perform modifications, truncate the file, and then write data back -- no temp files needed.

    With larger files and variable-length records, it's easier to work with temp files. If you attempt to update a variable-length record file without having a temp file, the code will get very ugly in no time. Sometimes, however, you just have to bite the bullet and do it; i.e., when you deal with huge files and you can't spare space for a temp file of the same size.

    If you're working with large fixed-length record files, it is almost always better and more elegant, in my opinion, to work with the original file without creating temp files.


    --perlplexer
Re: Re: Replacing a string in a file
by Avi (Acolyte) on Jul 16, 2003 at 19:12 UTC
    For opening the file for reading writing, how do you go about doing this? Do you have sample code? It is for a config file which is very small, so this solution would be great.

    Thanks,
    Avi
      Here's how I would approach this (not tested)
      use strict; use Fcntl ':flock'; my $iniFile = 'config.ini'; if (open my $ini, "+<$iniFile"){ if (flock $ini, LOCK_EX){ my @data = <$ini>; # Work with @data -- delete lines, update lines, etc. if (truncate($ini, 0) and seek($ini, 0, 0)){ print "Can't write to $iniFile : $!\n" unless print $ini @data; }else{ print "Can't truncate/seek : $!\n"; } }else{ print "Can't lock : $!\n"; } close $ini; }else{ print "Can't open $iniFile : $!\n"; }
      --perlplexer