my %a1; @a1{qw(a b c d e f g)} = (); my %a2; @a2{qw(b g)} = (); my @a1only = grep { not exists $a2{$_} } keys %a1; my @a2only = grep { not exists $a1{$_} } keys %a2; my @both = grep { exists $a2{$_} } keys %a1; my %u; my @either = grep { not $u{$_}++ } (keys %a1, keys %a2); # your question: print "subset" if not @a2only;