我想看看散列是否包含任何鍵列表。目前我有:帶有一組鍵的哈希查找?
if (grep {$me_hash{$_}} @me_list){
...
但我認爲這是效率低下,因爲它不會退出第一場比賽。有沒有更好,更習慣的方式來做到這一點?
kthxbi
我想看看散列是否包含任何鍵列表。目前我有:帶有一組鍵的哈希查找?
if (grep {$me_hash{$_}} @me_list){
...
但我認爲這是效率低下,因爲它不會退出第一場比賽。有沒有更好,更習慣的方式來做到這一點?
kthxbi
您可以使用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,例如空字符串,或者爲零0
。
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) { .. }
請注意,所有的'@ me_list'被放置在堆棧,但這應該是非常快的,因爲它不涉及多於指針的複製。 – ikegami