note
btrott
[perlfaq4]: [How do I look up a hash element by value?]:
<code>
Create a reverse hash:
%by_value = reverse %by_key;
$key = $by_value{$value};
That's not particularly efficient. It would be more
space-efficient to use:
while (($key, $value) = each %by_key) {
$by_value{$value} = $key;
}
If your hash could have repeated values, the methods
above will only find one of the associated keys.
This may or may not worry you.
</code>
You could probably use [tie] to do this magically, using
your FLIPPED key.
<code>
package SpecialHash;
use Tie::Hash;
@SpecialHash::ISA = qw/Tie::StdHash/;
sub FETCH {
$_[1] eq "FLIPPED" ?
{ reverse %{ $_[0] } } :
$_[0]->{$_[1]};
}
package main;
tie my %hash, 'SpecialHash';
@hash{ qw/foo bar/ } = qw/baz quux/;
use Data::Dumper;
print Dumper $hash{FLIPPED};
</code>
22237
22237