in reply to More efficient way to exclude footers

This is a perfect job for Tie::File, along with an array slice. Note that the @file array holds the file open, so if you change the array in any way, you'll also modify the file live-time. If you aren't editing the file, best to take a copy of the tied array, then untie @file before doing any processing.

use warnings; use strict; use Tie::File; my $file = 'a.txt'; my $num_headers = $ARGV[0]; my $num_footers = ++$ARGV[1]; tie my @file, 'Tie::File', $file or die $!; my $stop = scalar @file - $num_footers; my @section = @file[$num_headers..$stop]; untie @file; print "$_\n" for @section;

Input file:

h1 h2 data more data even more data blah f1 f2 f3

Result:

$ ./header.pl 2 3 data more data even more data blah

-stevieb

Replies are listed 'Best First'.
Re^2: More efficient way to exclude footers
by ikegami (Patriarch) on Aug 19, 2015 at 16:46 UTC

    This is a perfect job for Tie::File

    How so? It needlessly reads the entire file (except for the ~5 lines of headers and footers) twice!

    If that's no problem because the file is small, why didn't you just read the whole thing into memory instead of adding the monstrous overheard of Tie::File to the equation?

    If that's a problem because the file is large, use a rolling buffer. I think you'll find that saying it'll make it 10 times faster is an understatement.

      Thank you ikegami, I always appreciate being shown new (to me) and better/more efficient ways to do things.

      That's why I'm here... to learn, and to pass on.