Hi, 

Dharshana Eswaran <[EMAIL PROTECTED]> wrote:
> Keeping the classic (state machine) approach in mid, i tried 
> writing a logic for the same
> 
> But i am not able to retrieve the lines accurately,
> 
> Can you please help me with a small piece of code for the 
> same logic which you mentioned?

This example uses an array as a ring buffer to store
previous lines from the input. It'll match lines that
contain the string "foobar".

$. contains the number of the current line read from the
last used file handle. This value is in the range of 1..n.

$howmany is the ring buffer size and determines how many
lines of text (including the match) are shown.

Sample usage (assuming you're saving this as linebuf.pl):

$ ./linebuf.pl < linebuf.pl 
   12:   $buf[ $. % $howmany ] = $line;
   13: 
   14:   if( $line =~ m/foobar/ ){

#!/usr/bin/perl -w

use strict;

my @buf;

# number of context lines including matching line
my $howmany = 3;

while( my $line = <> ){
  # store current line in ring buffer
  $buf[ $. % $howmany ] = $line;

  if( $line =~ m/foobar/ ){

    # if we have a match, retrieve the previous
    # lines from the ring buffer.
    for( my $i = $howmany - 1; $i >= 0; $i-- ){
      # number of the line we're retrieving
      my $lineno = $. - $i;
      # show fewer (or no) context lines for a match
      # near (or at) the start of the input
      next unless $lineno >= 1;
      printf "%5d: %s", $lineno, $buf[ $lineno % $howmany ];
    }
  }
}
__END__

--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/


Reply via email to