哈希:测试密钥

时间:2017-03-22 22:43:20

标签: perl hash

程序将非常大的字典式TXT文件读入哈希。有时候,键的小写版本更可取。我的解决方案是笨拙的,因为即使我们已经知道lc版本存在,它也会搜索两次:

if ( exists $hash{ lc $key } ) {
   $key = lc $key;
}
if ( exists $hash{ $key } ) {
    # lot of code involving $key
}
else {
    # the key doesn't exist, other code
}

有没有办法避免两次exists测试?如果存在lc $key,我希望与第二个if中的代码相同,但我需要知道lc使用哪个$key版本。我希望将它浓缩为一对if-else

知道有效密钥的情况对于程序的其余部分很重要,因为它用于在另一个散列中查找信息。

3 个答案:

答案 0 :(得分:3)

if ( my ($real_key) = grep { exists($hash{$_}) } lc($key), $key ) {
   ...
} else {
   ...
}

my $real_key =
     exists($hash{ lc($key) }) ? lc($key)
   : exists($hash{ $key     }) ? $key
   : undef;

if (defined($real_key)) {
   ...
} else {
   ...
}

当然,它仍会搜索两次,但那又怎么样?您可以使用List :: Utils的first,但我认为用子调用替换哈希查找实际上可能会降低代码速度!

答案 1 :(得分:0)

您可以使用first中的List::Util。它将返回第一个列表元素,其中代码块的结果为真值,如果块永远不返回true,则返回undef

use List::Util qw(first);

$key = first { exists($hash{$_}) } lc($key), $key;

if (defined($key)) {
    # ...
}

答案 2 :(得分:0)

你也可以这样做:

$key = do { my $temp = lc $key; exists $hash{$temp} ? $temp 
      : ( exists $hash{$key} ? $key : undef) };

if ( defined $key ) {
    # lot of code involving $key
}
else {
    # the key doesn't exist, other code
}