my $pattern = qr( '^'. ( join '\.', map { defined($_) ? $_ : '[^.]*' } @query{ qw( provider source instrument detector ) } ). '$' ); my @matches = grep { $_ =~ m/$pattern/ } @data;