Here's an in-place edit example:
my $file = "mydata.txt"; # read data from file open my $fh, '+<', $file or die "can't open file $file : $!\n"; my @data = <$fh>; chomp @data; # modify data (add item) @data = sort (@data, 'Simon'); # rewind back to beginning seek($fh, 0, 0); for my $d (@data) { # write data back to file (skips blank lines) print $fh "$d\n" if $d; } # if new file is shorter than original, throw away extra truncate($fh, tell($fh)); close $fh;
Note that opening the file as '+<' means 'update mode'. The basic idea is read the file, modify the contents, then rewind back to the beginning with seek, write the new data back to the file - overwriting the original contents. If the new file is larger, you could stop here, but if it's shorter, you'll need to throw away the "extra" using truncate (so it's best to always use it, just in case). You might want to apply file locking here, depending on the application. For example, if you were using this in a webapp to add new users to an email list, you could potentially have multiple processes trying to update the file at the same time. Just add a flock($fh,2) after the open statement.
Also note that this assumes that the file is not so big that it can't be read into memory all at once.
You might also want to read up on perl's -i command line switch (in place edit). It actually copies the input to a temp file, reads from the temp file, and writes to the original file name - so the end results is that the output overwrites the original input.
In reply to Re: Inserting a line in the middle of a text
by scorpio17
in thread Inserting a line in the middle of a text
by goude
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |