Wie kann ich feststellen, ob ein Perl-Hash eine Schlüssel Zuordnung zu einem nicht definierten Wert enthält?

StackOverflow https://stackoverflow.com/questions/2124977

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.

War es hilfreich?

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} ) {
    ...
 }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top