Here is a version that I based heavily on jeffa's version above.
use strict; use warnings; use Tie::File; use Getopt::Std; our %opts; getopt('AB',\%opts); die "USAGE: $0 [-An] [-Bn] match file" unless @ARGV; my ($match,$filename) = @ARGV; my @file; tie @file, 'Tie::File', $filename, autochomp => 0; my @prebuffer; my $postbuffer_counter = 0; foreach (@file) { if (/$match/) { print @prebuffer, $_; @prebuffer = (); $postbuffer_counter = $opts{A} || 0; } else { if ($postbuffer_counter-- > 0) { print $_ } else { push @prebuffer, $_; shift @prebuffer if @prebuffer > $opts{B}; } } }
This prints as it finds matches and handles matches that are close together. I haven't done a whole lot of testing, so there very well may be other issues.
Comments and suggestions are welcome...
Cees
In reply to Re: linux grep feature
by cees
in thread Emulating GNU grep -A and -B switches with perl (was: linux grep feature)
by perlisfun
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |