2010-01-23 8 views
7

Ich muss feststellen, ob ein Perl-Hash einen bestimmten Schlüssel hat, aber dieser Schlüssel wird einem undef-Wert zugeordnet. Insbesondere liegt die Motivation dafür darin, boolesche Flags zu sehen, während getopt() mit einer darin übergebenen Hash-Referenz verwendet wird. Ich habe bereits diese Website und Google gesucht, und exists() und defined() scheinen nicht für die Situation anwendbar zu sein, sie sehen nur, wenn der Wert für einen bestimmten Schlüssel nicht definiert ist, sie überprüfen nicht, ob der Hash tatsächlich die hat Schlüssel. Wenn ich hier ein RTFM bin, weisen Sie bitte auf das Handbuch hin, das dies erklärt.Wie kann ich feststellen, ob ein Perl-Hash eine Schlüsselzuordnung zu einem nicht definierten Wert enthält?

Antwort

26

existiert() und() definiert scheinen nicht für die Situation anwendbar zu sein, sie sehen nur, wenn der Wert für einen bestimmten Schlüssel nicht definiert ist, sie Überprüfen Sie nicht, ob der Hash tatsächlich den Schlüssel

Falsch hat. Das ist in der Tat, was defined() tut, aber exists() tut genau das, was Sie wollen:

my %hash = (
    key1 => 'value', 
    key2 => undef, 
); 

foreach my $key (qw(key1 key2 key3)) 
{ 
    print "\$hash{$key} exists: " . (exists $hash{$key} ? "yes" : "no") . "\n"; 
    print "\$hash{$key} is defined: " . (defined $hash{$key} ? "yes" : "no") . "\n"; 
} 

produziert:

 
$hash{key1} exists: yes 
$hash{key1} is defined: yes 
$hash{key2} exists: yes 
$hash{key2} is defined: no 
$hash{key3} exists: no 
$hash{key3} is defined: no 

Die Dokumentation für diese beiden Funktionen in der Befehlszeile an perldoc -f defined verfügbar ist und perldoc -f exists (oder Lesen Sie die Dokumentation für alle Methoden unter perldoc perlfunc *). Die offizielle Web-Dokumentation ist hier:

* Da Sie speziell RTFM erwähnt, und Sie können nicht von den Orten der Perl-Dokumentation darüber im Klaren sein, lassen Sie mich auch darauf hinweisen, dass Sie einen vollständigen Index aller perldocs bei perldoc perl oder http://perldoc.perl.org erhalten können.

11

Wenn ich deine Frage richtig lese, denke ich, du bist verwirrt über exists. Von der documentation:

exists EXPR

ein expression Given, der ein hash element oder array element specifies, returns true, wenn das specified element im hash oder array ever initialized hat been, even wenn Der entsprechende Wert ist nicht definiert.

Zum Beispiel:

use strict; 
use warnings; 

my %h = (
    foo => 1, 
    bar => undef, 
); 

for my $k (qw(foo bar baz)){ 
    print $k, "\n" if exists $h{$k} and not defined $h{$k}; 
} 
6

Kurze Antwort:

if (exists $hash{$key} and not defined $hash{$key}) { 
    ... 
} 
Verwandte Themen