Path: usenet.cise.ufl.edu!huron.eel.ufl.edu!usenet.eel.ufl.edu!news.ultranet.com!nntp.cs.ubc.ca!news-spur1.maxwell.syr.edu!news.maxwell.syr.edu!newsfeed.corridex.com!nntp2.savvis.net!inetarena.com!not-for-mail
From: Uri Guttman <
[email protected]>
Newsgroups: comp.lang.perl.announce,comp.lang.perl.modules
Subject: ANN: Backwards.pm - read files backwards by lines
Followup-To: comp.lang.perl.modules
Date: 4 Feb 1999 14:09:31 GMT
Organization: Sysarch, Inc.
Lines: 107
Approved:
[email protected] (comp.lang.perl.announce)
Message-ID: <
[email protected]>
NNTP-Posting-Host: halfdome.holdit.com
X-Disclaimer: The "Approved" header verifies header information for article transmission and does not imply approval of content.
Xref: usenet.cise.ufl.edu comp.lang.perl.announce:232 comp.lang.perl.modules:8378
there has been a cry and hue for a long time for this and after a
suitable gestation period (including lots of laziness), i have finally
produced a Backwards.pm module.
it has both an object and a tied handle interface.
it is very fast. it typically is over 2 times faster than tom c's double
loop algorithm which builds an index of the lines and then seeks to each
one (that is without compile time, with compile time it depends on the
length of the file). the recipes in the cookbook are weak as they read
the file completely into memory. this module reads blocks of text from
the end of the file and returns lines from the block.
the beta version is at:
http://www.sysarch.com/perl/Backwards.pm
i am looking for testers to drive it hard before i post it to cpan. i
just applied for my cpan id so this will be my first official
submission.
I think it should go under the File:: hierarchy as
File::Backwards.pm. it doesn't use any of the IO:: modules, just Symbol,
Fcntl, Carp and integer.
BTW this code is published under my beer runtime license. every time it
is run, you have to drink a beer.
enjoy,
uri
here is the pod:
NAME
Backwards.pm -- Read a file backwards by lines.
SYNOPSIS
use Backwards ;
# Object interface
$bw = Backwards->new( 'log_file' ) ;
while( $log_line = $bw->readline ) {
print $log_line ;
}
# Tied Handle Interface
tie *BW, 'log_file' ;
while( <BW> ) {
print ;
}
DESCRIPTION
This module reads a file backwards line by line. It is simple to
use, memory efficient and fast. It supports both an object and a
tied handle interface.
It is intended for processing log and other similar text files
which typically have new entries appended. It uses newline as
the separator and not $/ since it is only meant to be used for
text.
It works by reading large (8kb) blocks of text from the end of
the file, splits them on newlines and stores the other lines
until the buffer runs out. Then it seeks to the previous block
and splits it. When it reaches the beginning of the file, it
stops reading more blocks. All boundary conditions are handled
correctly. If there is a trailing partial line (no newline) it
will be the first line returned. Lines larger than the read
buffer size are ok.
Object Interface
There are only 2 methods in Backwards' object interface, new and
readline.
new
New takes just a filename for an argument and it either returns
the object on a successful open on that file or undef.
readline
Readline takes no arguments and it returns the previous line in
the file or undef when there are no more lines in the file.
Tied Handle Interface
The only tied handle calls supported are TIEHANDLE and READLINE
and they are typeglobbed to new and readline respectively. All
other tied handle operations will generate an unknown method
error. Do not seek, write or do any other operation other than
<> on the handle.
--
Uri Guttman ----------------- SYStems ARCHitecture and Software Engineering
Perl Hacker for Hire ---------------------- Perl, Internet, UNIX Consulting
[email protected] ------------------------------------
http://www.sysarch.com
The Best Search Engine on the Net -------------
http://www.northernlight.com