如何确定所有哈希键是否都有值?
答案 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的结果导入definedmy @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);
}