So the end result for HIPPO1 and HIPPO2 should be the same, right? Assuming that, the following ends up with HIPPO as a key (no number -- just the 'root' name) (note that hashing on the 'root' animal name also eliminates the need for the nested looping over bigHash):
my %animals;
while( my ($state, $zoos) = each %bighash ){
while( my ($zoo, $row) = each %$zoos ){
my $animal = $row->[1];
$animal =~ s/\d+$//;
push @{$animals{$animal}->{$state}}, $zoo;
}
}
Note in your original code that
@zoos probably shouldn't be globally scoped.