You have to visit every value in order to determine if a certain value exists. We're talking about a pair of nested loops since your data structure has two levels.
To find the first match:
my $gene_to_find = 'NP_012'; my $matching_taxon; TAXON: for my $taxon (keys %gg) { for my $gene ( @{ $gg{$taxon} } ) { if ($gene eq $gene_to_find) { $matching_taxon = $taxon; last TAXON; } } } if (defined($matching_taxon)) { print("Gene $gene_to_find found in taxon $matching_taxon.\n"); } else { print("Gene $gene_to_find not found in any taxon.\n"); }
To find the all matches:
my $gene_to_find = 'NP_012'; my @matching_taxons; for my $taxon (keys %gg) { for my $gene ( @{ $gg{$taxon} } ) { if ($gene eq $gene_to_find) { push @matching_taxons, $taxon; } } } if (@matching_taxons) { print("Gene $gene_to_find found in taxons @matching_taxons.\n"); } else { print("Gene $gene_to_find not found in any taxon.\n"); }
If you do many such searches between changes to %gg, you should build a hash of taxons by gene from your hash of genes by taxons.
In reply to Re: how to access hash key from the hash value when hash key is pointing to an array of hash values?
by ikegami
in thread how to access hash key from the hash value when hash key is pointing to an array of hash values?
by BhariD
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |