mseery
mseery

Reputation: 1444

How can I make hash key lookup case-insensitive?

Evidently hash keys are compared in a case-sensitive manner.

$ perl -e '%hash = ( FOO => 1 ); printf "%s\n", ( exists $hash{foo} ) ? "Yes" : "No";'
No

$ perl -e '%hash = ( FOO => 1 ); printf "%s\n", ( exists $hash{FOO} ) ? "Yes" : "No";'
Yes

Is there a setting to change that for the current script?

Upvotes: 13

Views: 12276

Answers (4)

Pascal Cimon
Pascal Cimon

Reputation: 11

grep should do the trick if you make the pattern match case insensitive:

perl -e '%hash = ( FOO => 1 ); printf "%s\n", ( scalar(grep (/^foo$/i, keys %hash)) > 0) ? "Yes" : "No";'

If you have more then one key with various spelling you may need to check if the match is greater than 1 as well.

Upvotes: 1

amphetamachine
amphetamachine

Reputation: 30595

my %hash = (FOO => 1);
my $key = 'fOo'; # or 'foo' for that matter

my %lookup = map {(lc $_, $hash{$_})} keys %hash;
printf "%s\n", ( exists $hash{(lc $key)} ) ? "Yes" : "No";

Upvotes: 5

Leon Timmermans
Leon Timmermans

Reputation: 30225

You will have to use a tied hash. For example Hash::Case::Preserve.

Upvotes: 17

Paul Tomblin
Paul Tomblin

Reputation: 182782

The hash of a string and the same string with the case changed are not equal. So you can't do what you want, short of calling "uc" on every hash key before you create it AND before you use it.

Upvotes: 8

Related Questions