You can do that by buffering the last "B" lines.
my $B = 5; my $A = 3; my $re = qr/somepat/; my $skip = 0; my @lines; while (<>) { if (/$re/) { @lines = (); $skip = $A; } elsif ($skip) { --$skip; } else { push @lines, $_; print(shift(@lines)) if @lines > $B; } } print for @lines;
For test data, I used
keep 1 discard B5 discard B4 discard B3 discard B2 discard B1 somepat discard A1 discard A2 discard A3 keep 2 keep 3 discard B5 discard B4 discard B3 discard B2 discard B1 somepat discard A1 somepat discard A1 discard A2 discard A3 keep 4 discard B5 discard B4 discard B3 discard B2 discard B1 somepat discard A1 discard A2 discard A3 discard B1 somepat discard A1 discard A2 discard A3 keep 5
For output, you should get
keep 1 keep 2 keep 3 keep 4 keep 5
In reply to Re: Regex question
by ikegami
in thread Regex question
by jamsda
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |