如何使哈希键查找不区分大小写?

13

显然,哈希键以区分大小写的方式进行比较。

$ 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

是否有一种设置可以更改当前脚本的内容?

4个回答

17

我想知道这种实现方式相对于一开始就确保人们获取正确大小写的哈希键,是否存在速度和空间上的惩罚? - Paul Tomblin
它在空间上不应该花费太多,尽管它肯定会在时间上花费。话虽如此,在大多数情况下,我认为这并不重要。 - Leon Timmermans

8

字符串的哈希值和大小写不同的相同字符串的哈希值是不相等的。因此,除非在创建哈希键之前和使用哈希键之前都调用“uc”,否则无法实现您想要的操作。


5
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";

我喜欢你的想法,但是当我在Win32上使用ActiveState Perl运行它时,会出现“否”。我认为你的意思是:(exists $lookup{(lc $key)})?“是”:“否” - mseery

1

grep能够解决问题,如果您使模式匹配不区分大小写:

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

如果您有多个拼写不同的键,则还需要检查匹配是否大于1。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接