使用键数组进行哈希查找?

时间:2013-11-25 16:18:48

标签: perl

我想看看散列是否包含任何键列表。目前我有:

if (grep {$me_hash{$_}} @me_list){
    ...

但我认为它效率低,因为它不会在第一场比赛中退出。是否有更好,更惯用的方法呢?

kthxbi

2 个答案:

答案 0 :(得分:5)

您可以使用List::MoreUtilsany

use List::MoreUtils qw(any);
if (any { $me_hash{$_} } @me_list) {

第一场比赛可能发生短路。这个功能很简单,看起来像这样:

sub any (&@) {
    my $f = shift;
    foreach ( @_ ) {
        return YES if $f->();
    }
    return NO;
}

YESNO定义为

use constant YES => ! 0;
use constant NO  => ! 1;

意味着您可以使用类似

的方式摆放自己的版本
sub is_in {
    my ($href, @list) = @_;
    for (@list) {
        return 1 if $href->{$_};
    }
    return 0;
}

请注意,您使用的语句$me_hash{$_}可能会为您可能不会认为为false的值返回false,例如空字符串或零0

答案 1 :(得分:1)

List::Util不同的

List::MoreUtils是核心模块,

use List::Util qw(first);
if (defined first {$me_hash{$_}} @me_list) { .. }

如果您不想使用任何外部模块,

my $any = sub{ $me_hash{$_} and return 1 for @_; 0 }->(@me_list);
if ($any) { .. }