use Data::Dump "pp"; my %hash = ('one' => '1', 'two' => '2','1'=>'one'); my %seen; for my $key ( keys %hash ) { delete $hash{$key} if $seen{$key} || $seen{$hash{$key}}; $seen{$key}++; $seen{$hash{$key}}++; } pp \%hash; -- { 1 => "one", two => 2 }