$ perl -Mstrict -Mwarnings -e ' use List::MoreUtils qw{uniq}; use Data::Dumper; my @pets = ( { a => "cat", b => "dog" }, { c => "dog", d => "cat" }, { e => "dog" }, { f => "cat" }, { g => "goldfish" }, { h => "cat", i => "cat" }, { j => "cat", k => "cat", l => "dog", m => "dog" }, ); my @cat_and_dog; for (@pets) { push @cat_and_dog, $_ if 2 == grep { /^(?:cat|dog)$/ } uniq values %$_; } print Dumper \@cat_and_dog; ' $VAR1 = [ { 'b' => 'dog', 'a' => 'cat' }, { 'd' => 'cat', 'c' => 'dog' }, { 'j' => 'cat', 'k' => 'cat', 'l' => 'dog', 'm' => 'dog' } ];