Count the lines in the file ( how to do this is documented in perlfaq ), subtract 20000 from that number and put the result in $start_at, then open the logfile for reading, incrementing the counter for each line read in and ignore until you've hit $start_at ...
Or ... 75MB is not *that* huge these days. You could load the whole file into memory and just grab the last 20000 lines, e.g.
# get_last returns an array reference for efficiency,
# so we need to de-reference; hence the @{} around
# the subroutine call
my @lines = @{ get_last("foo.log", 20000) };
sub get_last {
my ($filename, $from_last) = @_;
open FILE, $filename or die "Can't open $filename: $!\n";
my @lines = <FILE>; #loads the whole thing into memory
close FILE;
# return the last $from_last lines in an anonymous array
# $#array_name is the index of the last element of
# the array, so @lines[$#lines-20, $#lines] is the
# last 20 elements of @lines
[ @lines[$#lines-$from_last, $#lines] ];
}
HTH
Philosophy can be made out of anything. Or less -- Jerry A. Fodor |