$ perl -Mstrict -Mwarnings -E ' my (%x, %y) = (a => 1, b => 2, c => 3, d => 1, e => 2, f => 1); push @{$y{$x{$_}}}, $_ for keys %x; say "$_: ", join ", ", @{$y{$_}} for keys %y; ' 1: a, d, f 2: b, e 3: c #### $ perl -Mstrict -Mwarnings -E ' my (%x, %y) = (a => 1, b => 2, c => 3, d => 1, e => 2, f => 1); push @{$y{$x{$_}}}, $_ for keys %x; say "$_: ", join ", ", @{$y{$_}} for keys %y; ' 2: e, b 1: d, a, f 3: c #### $ perl -Mstrict -Mwarnings -E ' my (%x, %y) = (a => 1, b => 2, c => 3, d => 1, e => 2, f => 1); push @{$y{$x{$_}}}, $_ for keys %x; say "$_: ", join ", ", @{$y{$_}} for keys %y; ' 3: c 1: f, d, a 2: b, e #### $ perl -Mstrict -Mwarnings -E ' my %orig = (a => 1, b => 2, c => 3, d => 1, e => 2, f => 1); my %temp; push @{$temp{$orig{$_}}}, $_ for keys %orig; say "$_: ", join ", ", @{$temp{$_}} for keys %temp; ' 1: a, d, f 3: c 2: b, e