Reputation: 1444
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
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
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
Reputation: 30225
You will have to use a tied hash. For example Hash::Case::Preserve.
Upvotes: 17
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