2009-07-03 4 views

Répondre

8

De 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]; 

Un élément de hachage ou d'un tableau peut être vrai que si elle est définie et définie si elle existe, mais l'inverse ne tenir nécessairement vrai.

+0

existe et supprimer sur les éléments de tableau ont des propriétés intéressantes et pas toujours utiles. Si vous en avez vraiment besoin, il vaut mieux utiliser un hash. – ysth

4

Si la clé existe, il a une valeur (même si cette valeur est undef) si:

my @keys_with_values = keys %some_hash; 
6

Flux le résultat de keys en grep avec defined

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

Relire votre question, il semble que vous essayez de savoir si l'une des valeurs dans votre hachage sont indéfinies, auquel cas vous pourriez dire quelque chose comme

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

Votre question est incomplète donc ce code peut être la réponse ;-)

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: j'avais relu question à nouveau et a décidé que la réponse peut être:

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

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

Si tout ce que vous voulez est de savoir si toutes les valeurs sont définies, ou tout indéfini, cela fera:

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

Voici une autre façon, en utilisant each. TIMTOWDI

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