需要幫助搞清楚工作的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!";}
需要幫助搞清楚工作的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!";}
您可以使用grep功能。這裏有一個簡單的例子:
print "YAY!" if grep { $hash{'key1'} eq $_ } @array;
在這樣的grep標量上下文給你匹配的條目的數量@array
。如果那不是零,你有一場比賽。
你也可以使用哈希:
@hash{"value3","value4","value6"}=undef;
print "YAY" if exists $hash{key1};
一個5.10+解決方案:使用smart-match!
say 'Modern Yay!' unless $hash{$key} ~~ @array;
CPAN解決辦法:用List::MoreUtils
use List::MoreUtils qw{any};
print "YAY!" if any { $hash{'key1'} eq $_ } @array;
爲什麼用此溶液替代?
不能使用在Perl智能賽前5.10
grep
解決方案通過,即使1,000,000一長串的第一個元素相匹配的整個列表循環。 any
會在發現第一個匹配時短路並退出,因此效率更高。
警告:即使1,000,000長列表的第一個元素匹配,grep解決方案也會遍歷整個列表。 – DVK 2010-12-21 15:14:42