Ob undef Schlüssel Hash in Perl?

Antwort — Nein.

undef kann nicht als Schlüssel Hash in Perl. Aber es gibt Feinheiten die den Eindruck dass kann. Details siehe unten.

Was ist ein Hash

Eine der Datenstrukturen, die es in der Programmiersprache Perl ist ein Hash. Hash ist eine ungeordnete Reihe von Wertepaaren. Hier ist ein Beispiel einer Hash:

my %h = (
    aa => 1,
    bb => 2,
);

In diesem хеше gespeichert zwei Wertepaare. Im Schlüssel mit dem Namen 'aa' speichert den Wert 1, und in der Tonart mit dem Namen 'bb' speichert den Wert 2. Um diese Werte zu erhalten, benutzen Syntax $h{aa} und $h{bb}.

Was ist undef

undef — diese Besondere Bedeutung in Perl, das bedeutet, dass keine Werte. Wenn Sie eine Variable erstellen, aber nicht auf einen gar keinen Wert, wird Ihr Wert gerade undef:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

my $var;

print Dumper $var;

Das Programm zeigt den Text $VAR1 = undef;.

undef kann man noch bekommen wenn man an die nicht existente Element des Arrays oder zu nicht existente Schlüssel in хеше. Sie können explizit als undef Variable: $var = undef;.

Die fehlerhaften Verwendung 1

Hier ist ein Beispielprogramm aus dem es scheint, dass undef kann der Schlüssel Hash:

▶ Run
#!/usr/bin/perl

my %h = (
    undef => 'asdf',
);

print $h{undef};

Das Programm zeigt den Text asdf. D.h. als ob wir haben in хеше Schlüssel undef, und dann holten Wert für diesen Schlüssel. Aber es ist nicht so. In diesem Beispiel wird der Wert gespeichert in der Tonart 'undef', D. H. Zeile 'undef', und nicht eine echte undef.

So ist aufgrund von zwei Eigenschaften.

Bei der Erstellung von Hash haben wir in ihm ein paar Schlüssel-Wert mit dem Code undef => 'asdf',. In diesem Code wird der Operator =>. Die Besonderheit dieser der Betreiber, dass in manchen Situationen kann er wahrnehmen, was befindet sich als Zeichenfolge auf der linken Seite. Er schien schließt die Tatsache, dass Links von => in Anführungszeichen. undef => 'asdf', ist eigentlich 'undef' => 'asdf',.

Das zweite Merkmal ist, wie wir Holen den Wert aus dem Hash-Wert nach dem Schlüssel. Wir verwenden die Syntax $h{undef}. Und da Perl meint, dass das was in den geschweiften Klammern ist eine Zeichenkette. Das, was wir hier geschrieben haben ist das gleiche wie $h{'undef'}.

Sie können sicher sein, daß es wirklich so, wenn Sie das Skript ausführen, indem Sie ein spezielles Modul, das statt den Code auszuführen, zeigt, wie Perl versteht diesen Code. perl -MO=Deparse script.pl. Hier ist die Ausgabe:

my(%h) = ('undef', 'asdf');
print $h{'undef'};
script.pl syntax OK

Die fehlerhaften Verwendung von 2

Hier ein weiteres Beispiel-Code aus dem irrtümlich scheint, dass undef kann der Schlüssel von Hash. Hier-das wir verwenden echte undefund nicht Zeile 'undef':

▶ Run
#!/usr/bin/perl

my $var = undef;

my %h = (
    $var => 'asdf',
);

print $h{$var};

Das Programm zeigt den Text asdf. D.h. es scheint wirklich, dass wir wir haben Wert in хеше nach dem Schlüssel undef.

Aber eigentlich haben wir den Wert im Schlüssel '' (eine leere Zeichenfolge). Wenn Anhängen am Ende der Zeile dieses Programms use Data::Dumper und warn Dumper \%h;, dann nach dem Start auf dem Bildschirm wird sichtbar, wie sieht eigentlich der Hash:

$VAR1 = {
          '' => 'asdf'
        };

Variable $var enthält den Wert undef, aber bei der Verwendung in $var => 'asdf', und $h{$var} undef wird ersetzt durch eine leere Zeichenfolge ''.

Wenn Sie im Code use strict; und use warnings; (was fast immer tun sollte), dann in der Ausgabe des Programms wird ersichtlich, dass Perl warnt vor einem solchen Einsatz:

Use of uninitialized value $var in list assignment at script.pl line 8.
Use of uninitialized value $var in hash element at script.pl line 12.

Zusammenfassung

undef kann nicht mit dem Wert des Schlüssels in Perl хеше. Schlüssel in Perl хеше — es ist immer eine Zeile. (Klären Sie nur, dass eine leere Zeile '' kann auch der Schlüssel). Die Werte, die in хеше kann völlig irgendwelchen und dort kann ohne Probleme undef.

Andere Artikel