my %h = ( a => 10, b => 10, c => 'd', e => 'd', f => 'a', ); my %x; while ( my ( $k, $v ) = each %h ) { push @{ $x{$v} }, $k; } __END__ $x = { 'a' => [ 'f' ], '10' => [ 'a', 'b' ], 'd' => [ 'e', 'c' ] }; #### my %n = reverse %h; %n = reverse %n;