【问题标题】:How can I make hash key lookup case-insensitive?如何使哈希键查找不区分大小写?
【发布时间】:2010-09-23 12:39:51
【问题描述】:

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

$ 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

是否有设置可以更改当前脚本的设置?

【问题讨论】:

    标签: perl hash


    【解决方案1】:

    一个字符串的hash和大小写改变的同一个字符串不相等。所以你不能做你想做的事,除了在创建之前和使用之前在每个哈希键上调用“uc”。

    【讨论】:

      【解决方案2】:

      您将不得不使用绑定哈希。例如Hash::Case::Preserve

      【讨论】:

      • 我想知道与首先确保人们在正确的情况下获得哈希键相比,此实现的速度和空间损失是多少?
      • 我不应该在空间上花费太多,尽管它肯定会花费时间。话虽如此,在大多数情况下,恕我直言,这并不重要。
      【解决方案3】:
      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 中运行它时,我得到“否”。我想你的意思是:(存在 $lookup{(lc $key)} )? “是”:“否”
      【解决方案4】:

      grep 如果您使模式匹配不区分大小写,则应该可以解决问题:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-03
        • 1970-01-01
        • 2010-09-23
        相关资源
        最近更新 更多