in reply to unreadline function?

one idea is to do the loop like this
my $line = ''; while(1) { $line = $line ? $line : <FH>; last unless defined $line; unless(isNewRecordLine($line)) { addToRecord($line); $line = ''; } else { processRecord(); } }
or you could use seek (SEEK_CUR) to get the file position information and store it in some variable and when you detect a new record, you just use seek (SEEK_SET) again to reposition the filepointer.

Have fun!

Replies are listed 'Best First'.
Re:x2 unreadline function?
by grinder (Bishop) on Mar 01, 2004 at 08:55 UTC

    I really hate unless (cond) { ... } else { ... } constructs. I think they're better written as if (not cond) { ... } else { ... }. It could be I'm an old C programmer, but I find it easier to follow.

    More importantly, I think your code will fail to process the last record. I would do something like the following:

    my @record; while( <FH> ) { chomp; if( /start-delim/ ) { @record and process( @record ); @record = (); } push @record, $_; } @record and process( @record );

    If there was an end delimiter, the loop could be flipped around to a do/while, and one could do away with the two calls to process().

    I note in passing that davido's idea of setting $/ is excellent, but it onlys work if the delimiter is a fixed string. If you need an RE to match the delimiter, a different approach is also possible.