2010-12-20 64 views
0

需要幫助搞清楚工作的Perl代碼到位「任何在@array的元素」有條件的陳述書比較值存儲在陣列

%hash = (key1 => 'value1',key2 => 'value2',key3 => 'value3',); 

@array= ('value3','value4','value6'); 

if ($hash{ 'key1' } ne <<any of the elements in @array>>) {print "YAY!";} 

回答

1

您可以使用grep功能。這裏有一個簡單的例子:

print "YAY!" if grep { $hash{'key1'} eq $_ } @array; 

在這樣的grep標量上下文給你匹配的條目的數量@array。如果那不是零,你有一場比賽。

+1

警告:即使1,000,000長列表的第一個元素匹配,grep解決方案也會遍歷整個列表。 – DVK 2010-12-21 15:14:42

1

你也可以使用哈希:

@hash{"value3","value4","value6"}=undef; 
print "YAY" if exists $hash{key1}; 
4

一個5.10+解決方案:使用smart-match

say 'Modern Yay!' unless $hash{$key} ~~ @array; 
5

CPAN解決辦法:用List::MoreUtils

use List::MoreUtils qw{any}; 
print "YAY!" if any { $hash{'key1'} eq $_ } @array; 

爲什麼用此溶液替代?

  • 不能使用在Perl智能賽前5.10

  • grep解決方案通過,即使1,000,000一長串的第一個元素相匹配的整個列表循環。 any會在發現第一個匹配時短路並退出,因此效率更高。