#Handle the case of overlapping groups $groupID = 1; my %groupSeen; foreach my $group1 (keys %groupOfBact){ foreach my $group2 (keys %groupOfBact){ if ($group1 != $group2){ foreach my $strain (keys %{$groupOfBact{$group1}}){ if((exists $groupOfBact{$group2}{$strain})&&(!exists $groupSeen{$strain})){ %{$updatedGroupHash{$groupID}} = (%{$groupOfBact{$group1}}, %{$groupOfBact{$group2}}); foreach my $seen (keys %{$updatedGroupHash{$groupID}} ){ $groupSeen{$seen}=1; } $groupID++; last; } else { %{$updatedGroupHash{$groupID}} = %{$groupOfBact{$group1}}; } } } } }