in reply to truncating a text file

Since you need to write the entire file to add to the front of it, just write 5 things back. Using truncate would actually be extra work.

# Load old list. my @sets = do { open(my $fh, '<', $file) or die("Unable to open set list \"$file\": $!\n"); local $/ = '<br>'; <$fh> }; # Add new item to the top. unshift @sets, "a new set - line 7<br>"; # Keep the top 5. if (@sets > 5) { @sets = @sets[0..4]; } # Save new list. { open(my $fh, '>', $file) or die("Unable to create set list \"$file\": $!\n"); print $fh @sets; }

Update: Fixed indexes on slice.

Replies are listed 'Best First'.
Re^2: truncating a text file
by Anonymous Monk on Jul 17, 2007 at 04:20 UTC
    I gave this one a try first. The couple snags I ran into were that you end up with 4 lines instead of five, as well as in reverse order. I wasn't very specific about sort order, sorry about that.

    The program outputs lines in the order of line 1,2,3,4,5 and just shoves things into the front so it will be displayed on top in the html page. Before removing the last line, the file would look like:

    line 1
    line 5
    line 4
    line 3
    line 2
    line 1

    and end in:

    line 1
    line 5
    line 4
    line 3
    line 2

    The goal is to make it so the file doesn't keep growing in this endless process, and to keep the most recent on top as it is a link to the most recent results.

    Being that I'm new to perl, this was the only suggestion I've been able to try so far. I'll continue reading to see if I can figure out the other suggestions and give them a shot.

    Thank you very much.
    ^_^

      Oops,

      # Keep the last 5. if (@sets > 5) { @sets = @sets[-5..-1]; }

      should be

      # Keep the first 5. if (@sets > 5) { @sets = @sets[0..4]; }

      It's a remenant of an incorrect version I wrote before posting.

      (I updated my earlier post to remove the error.)