in reply to Regex question

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