我想看看散列是否包含任何键列表。目前我有:
if (grep {$me_hash{$_}} @me_list){
...
但我认为它效率低,因为它不会在第一场比赛中退出。是否有更好,更惯用的方法呢?
kthxbi
答案 0 :(得分:5)
您可以使用List::MoreUtils
的any
use List::MoreUtils qw(any);
if (any { $me_hash{$_} } @me_list) {
第一场比赛可能发生短路。这个功能很简单,看起来像这样:
sub any (&@) {
my $f = shift;
foreach ( @_ ) {
return YES if $f->();
}
return NO;
}
将YES
和NO
定义为
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) { .. }