my ( @buffer, @data ); while ( ) { if ( /(DATE_PATTERN)/ ) { push @buffer, [ $., $1 ]; shift @buffer if @buffer > 8; } if ( /SEARCH_PATTERN/ && @buffer && $buffer[ 0 ][ 0 ] == $. - 8 ) { push @data, [ $buffer[ 0 ][ 1 ], $_ ]; } }