简体   繁体   English

如何在哈希中查找所有键在Perl中具有值

[英]How to find all Keys in a hash have a value in Perl

您如何确定所有哈希键是否都具有某些值?

From perldoc -f exists : 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];

A hash or array element can be true only if it's defined, and defined if it exists, but the reverse doesn't necessarily hold true. 哈希或数组元素只有在已定义且已定义(如果存在)的情况下才可以为true,但相反的情况不一定成立。

Feed the result of keys into grep with defined 的结果输入到具有定义的 grep中

my @keys_with_values = grep { defined $hash{$_} } keys %hash;

Rereading your question, it seems like you are trying to find out if any of the values in your hash are undefined, in which case you could say something like 重读您的问题,似乎您正在尝试找出哈希中的任何值是否未定义,在这种情况下,您可以说

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";
}

如果键存在,则它具有一个值(即使该值是undef ),因此:

my @keys_with_values = keys %some_hash;

Your question is incomplete thus this code can be answer ;-) 您的问题不完整,因此该代码可以作为答案;-)

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;

EDIT: I had reread question again and decided that answer can be: 编辑:我再次重读了问题,并决定答案可以是:

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

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

If all you want is to know if all values are defined, or any undefined this will do that: 如果您只想知道是否已定义所有值,或者任何未定义的值,则可以这样做:

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

Here's one more way, using each . 这是使用each的另一种方法。 TIMTOWDI 蒂莫迪

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM