in reply to mildly tricky hash question

Try...
my %reverse_hash; foreach my $key ( keys %hash ) { push @{$reverse_hash{$hash{$key}}, $key; }

Or maybe a little clearer:

my %reverse_hash; while ( my ( $key, $value ) = each %hash ) { push @{$reverse_hash{$value}}, $key; }


Dave

Replies are listed 'Best First'.
Re: Re: mildly tricky hash question
by matija (Priest) on Mar 30, 2004 at 08:43 UTC
    That would give him a hash of arrays - not what he's looking for. You could join all the arrays right after your loop, or you could change it to
    my %reverse_hash; foreach my $key ( keys %hash ) { $reverse_hash{$key}=$reverse_hash{$key} ? "$reverse_hash{$key},$hash{$key}" : $hash{$key}; }
      I'm getting an "undefined" error at the print statement when I use that bit of code. Warnings says that line 16 is using an uninitilized value..... what have I done wrong?
      #!/usr/bin/perl -w use strict; my $key; my %hash = ( ball1 => 'red', ball2 => 'blue', ball3 => 'red', ); # thanks to http://www.perlmonks.org/index.pl?node_id=340896 for this +block of code my %reverse_hash; foreach $key ( keys %hash ) { $reverse_hash{$key} = $reverse_hash{$key} ? "$reverse_hash{$key},$hash{$key}" : $hash{$key}; } print "$reverse_hash{red}\n";