如何查找散列中的所有键在Perl中具有值

时间:2009-07-03 09:31:09

标签: perl

如何确定所有哈希键是否都有值?

6 个答案:

答案 0 :(得分:8)

来自perldoc -f exists

               print "Exists\n"    if exists $hash{$key};
               print "Defined\n"   if defined $hash{$key};
               print "True\n"      if $hash{$key};

               print "Exists\n"    if exists $array[$index];
               print "Defined\n"   if defined $array[$index];
               print "True\n"      if $array[$index];
  

哈希或数组元素可以为true   只有它被定义,并定义如果   它存在,但相反却没有   必然适用。

答案 1 :(得分:6)

使用keys

grep的结果导入defined
my @keys_with_values = grep { defined $hash{$_} } keys %hash;

重读你的问题,似乎你试图找出你的哈希中的任何值是否未定义,在这种情况下你可以说类似

my @keys_without_values = grep { not defined $hash{$_} }, keys %hash;
if (@keys_without_values) {
    print "the following keys do not have a value: ",
        join(", ", @keys_without_values), "\n";
}

答案 2 :(得分:4)

如果密钥存在,则它有一个值(即使该值为undef),所以:

my @keys_with_values = keys %some_hash;

答案 3 :(得分:1)

您的问题不完整,因此可以回答此代码; - )

my %hash = (
    a => 'any value',
    b => 'some value',
    c => 'other value',
    d => 'some value'
);
my @keys_with_some_value = grep $hash{$_} eq 'some value', keys %hash;

编辑:我再次重读了问题并决定答案可以是:

sub all (&@) {
  my $pred = shift();
  $pred->() or return for @_;
  return 1;
}

my $all_keys_has_some_value = all {$_ eq 'some value'} values %hash;

答案 4 :(得分:0)

如果您只想知道是否定义了所有值,或者任何未定义的值,那么这样做:

sub all_defined{
  my( $hash ) = @_;
  for my $value ( values %$hash ){
    return '' unless defined $value; # false but defined
  }
  return 1; #true
} 

答案 5 :(得分:0)

这是另一种方法,使用each。 TIMTOWDI

 while (my($key, $value) = each(%hash)) {
      say "$key has no value!" if ( not defined $value);
 }