How do I look up a hash element by value?

Create a reverse hash:

    %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.