2013-11-25 71 views
1

我想看看散列是否包含任何鍵列表。目前我有:帶有一組鍵的哈希查找?

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

但我認爲這是效率低下,因爲它不會退出第一場比賽。有沒有更好,更習慣的方式來做到這一點?

kthxbi

回答

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,例如空字符串,或者爲零0

+1

請注意,所有的'@ me_list'被放置在堆棧,但這應該是非常快的,因爲它不涉及多於指針的複製。 – ikegami

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) { .. } 
相關問題