%by_value = reverse %by_key; $key = $by_value{$value};
That's not particularly efficient. It would be more efficient of space to use:
while (($key, $value) = each %by_key) { $by_value{$value} = $key; }
If your hash might have repeated values, the methods above will only find one of the associated keys. This may or may not worry you.