c:\@Work\Perl\monks>perl -wMstrict -le
"my %h = qw(a 1 b 2 c 3 d 1);
;;
my %r = reverse %h;
keys %r == keys %h or die qq{hash @{[ %h ]} not unique};
"
hash c 3 a 1 b 2 d 1 not unique at -e line 1.
####
c:\@Work\Perl\monks>perl -wMstrict -le
"use Data::Dump qw(dd);
;;
my %h = (
a => [ 1 ], b => [ 2, 99, 88 ], c => [ 3 ], d => [ 1, 99 ]
);
;;
my %r;
for my $hk (keys %h) {
push @{ $r{$_} }, $hk for @{ $h{$hk} };
}
dd \%r;
"
{ 1 => ["a", "d"], 2 => ["b"], 3 => ["c"], 88 => ["b"], 99 => ["b", "d"] }
##
##
c:\@Work\Perl\monks>perl -wMstrict -le
"use Test::More 'no_plan';
use Test::NoWarnings;
;;
use Data::Dump qw(dd);
;;
my %h = (
a => [ 1 ], b => [ 2, 99, 88 ], c => [ 3 ], d => [ 1, 99 ]
);
;;
my %r = invert(%h);
dd \%r;
;;
my %rr = invert(%r);
dd \%rr;
;;
is_deeply \%rr, \%h, 'round trip';
;;
done_testing;
;;
exit;
;;
sub invert {
my %h = @_;
my %r;
for my $hk (keys %h) {
push @{ $r{$_} }, $hk for @{ $h{$hk} };
}
return %r;
}
"
{ 1 => ["a", "d"], 2 => ["b"], 3 => ["c"], 88 => ["b"], 99 => ["b", "d"] }
{ a => [1], b => [99, 88, 2], c => [3], d => [99, 1] }
not ok 1 - round trip
# Failed test 'round trip'
# at -e line 1.
# Structures begin differing at:
# $got->{b}[0] = '99'
# $expected->{b}[0] = '2'
1..1
ok 2 - no warnings
1..2
# Looks like you failed 1 test of 2.