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

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.