my %dmap = ( 1 => undef, 2 => 4, 3 => 5, 4 => 3, 5 => 1, ); my $key = 0; defined $dmap{$_} or $dmap{$_} = $key for keys %dmap; my %pamd = reverse %dmap; print $key = $pamd{$key} while $pamd{$key};