1

我正在处理像这样的哈希:

my %hash1 = (
  key1 => 0,
  key2 => 1,
  key3 => 0,
);

如果所有值(不仅仅是一个值)的值为 1 ,我想做一些事情%hash1

怎么写?

作为参考,我可以写:

for $key ( keys %hash1 ) {
   if ( $hash1{$key} == 1 ){
    #do something
   }
}

这是错误的,因为即使一个键的值等于 1,这#do something部分代码也会运行。如果至少一个键等于 1,我编写的代码显然会做一些事情。如果有类似的东西会很好:

for $key ( keys %hash1 ) {
   if ( exists( $hash1{$key} == 1 ) ){
    #do something
   }
}
4

3 回答 3

6

我会做:

my $not_all_ones = grep { $_ != 1 } values %hash1;
于 2013-08-21T08:56:42.307 回答
4

您可以使用List::MoreUtils

use List::MoreUtils qw/all/;

if (all { $_ == 1 } values %hash) {
  # iterate the hash
  while (my ($k, $v) = each %hash) {
    ...
  }
}

all { something($_) } @list是一种奇特的写作方式

!grep { !something($_) } @list

它使用德摩根定律

请注意,my %hash = { key => 1 }它不会创建您想要的数据结构。相反,这会将一个键映射"HASH(0x1234567)"undef. 如果您use warnings是 ,您将收到一条消息,告诉您您正在使用(散列)引用,其中需要列表。使用键值列表初始化散列:my %hash = ( key => 1).

于 2013-08-21T10:01:19.327 回答
2

在循环后设置一个标志if并检查其值。

$all_are_one = $all_are_one && $hash1{$key} == 1

您需要在循环之前将其设置为 true

于 2013-08-21T08:55:42.333 回答