程序将非常大的字典式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
。
知道有效密钥的情况对于程序的其余部分很重要,因为它用于在另一个散列中查找信息。
答案 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
}