my $scan = [0,qr/a/,2,qr/C/]; my @filtered = grep scan $scan, @$table sub scan { my $aref = shift; my $i = 0; while( ++$i < @$aref ){ return unless $_->[$i-1] =~ $aref->[$i++] } 1 }