Wie kann ich feststellen, ob ein Perl-Hash eine Schlüssel Zuordnung zu einem nicht definierten Wert enthält?
Frage
ich brauche, um zu bestimmen, ob ein Perl-Hash einen bestimmten Schlüssel hat, aber das Schlüssel zu einem undef Wert abgebildet werden. Insbesondere wird die Motivation dafür zu sehen, wenn boolean Flaggen während getopt()
Verwendung mit einem Hashreferenz hineingeben. Ich habe schon gesucht, sowohl diese Website und Google, und exists()
und defined()
scheinen nicht für die Situation anwendbar zu sein, sie nur sehen, wenn der Wert für einen bestimmten Schlüssel nicht definiert ist, sie nicht überprüfen, ob der Hash hat eigentlich die Schlüssel. Wenn ich ein hier RTFM, mir bitte auf das Handbuch verweisen, die dies erklärt.
Lösung
exists () und () definierte scheint nicht für die Situation anwendbar zu sein, sie sehen nur, wenn der Wert für einen bestimmten Schlüssel nicht definiert ist, sie nicht überprüfen, ob der Hash tatsächlich hat den Schlüssel
Falsch. 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";
}
erzeugt:
$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 ist in der Befehlszeile an perldoc -f defined
und perldoc -f exists
verfügbar (oder die Dokumentation für alle Methoden bei perldoc perlfunc
lesen *). 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 bei http://perldoc.perl.org .
Andere Tipps
Wenn ich Ihre Frage richtig bin zu lesen, ich glaube, Sie sind verwirrt über existiert . Aus der Dokumentation:
existiert EXPR
Da ein Ausdruck, der angibt, ein Hash-Element oder Array-Element, kehrt true, wenn das angegebene Element in der hash oder Array hat jemals zuvor initialisiert, auch wenn die entsprechenden 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};
}
Kurze Antwort:
if ( exists $hash{$key} and not defined $hash{$key} ) {
...
}