Was ist der Unterschied zwischen einer Hash- und Hash -Referenz in Perl?
-
08-07-2019 - |
Frage
Ich möchte Hashes in Perl richtig verstehen. Ich musste Perl für einige Zeit zeitweise verwenden und meistens, wenn ich es tun muss, hängt es hauptsächlich mit der Textverarbeitung zusammen.
Und jedes Mal muss ich mich mit Hashes auseinandersetzen, es wird durcheinander. Ich finde die Syntax für Hashes sehr kryptisch
Eine gute Erklärung für Hashes- und Hash -Referenzen, ihre Unterschiede, wenn sie erforderlich sind usw. wäre sehr geschätzt.
Lösung
Ein einfacher Hash ist nahe an einem Array. Ihre Initialisierungen sehen sogar ähnlich aus. Zuerst das Array:
@last_name = (
"Ward", "Cleaver",
"Fred", "Flintstone",
"Archie", "Bunker"
);
Lassen Sie uns nun die gleichen Informationen mit einem Hash (auch bekannt als assoziatives Array) darstellen:
%last_name = (
"Ward", "Cleaver",
"Fred", "Flintstone",
"Archie", "Bunker"
);
Obwohl sie den gleichen Namen haben, das Array @last_name
und der Hash %last_name
sind völlig unabhängig.
Wenn wir mit dem Array Archies Nachname kennenlernen wollen, müssen wir eine lineare Suche durchführen:
my $lname;
for (my $i = 0; $i < @last_name; $i += 2) {
$lname = $last_name[$i+1] if $last_name[$i] eq "Archie";
}
print "Archie $lname\n";
Mit dem Hash ist es viel direkter syntaktisch:
print "Archie $last_name{Archie}\n";
Sagen Sie, wir möchten Informationen mit nur etwas reichhaltigerer Struktur darstellen:
- Cleaver (Nachname)
- Ward (Vorname)
- Juni (Vorname des Ehepartners)
- Flintstone
- Fred
- Wilma
- Bunker
- Archie
- Edith
Bevor die Referenzen kamen, waren Flat-Schlüsselwert-Hashes ungefähr das Beste, was wir tun konnten, aber Referenzen erlauben es
my %personal_info = (
"Cleaver", {
"FIRST", "Ward",
"SPOUSE", "June",
},
"Flintstone", {
"FIRST", "Fred",
"SPOUSE", "Wilma",
},
"Bunker", {
"FIRST", "Archie",
"SPOUSE", "Edith",
},
);
Intern die Schlüssel und Werte von %personal_info
sind alle Skalare, aber die Werte sind eine besondere Art von Skalar: Hash Referenzen, erstellt mit {}
. Die Referenzen ermöglichen es uns, "mehrdimensionale" Hashes zu simulieren. Zum Beispiel können wir über Wilma überkommen
$personal_info{Flintstone}->{SPOUSE}
Beachten Sie, dass Perl es uns ermöglicht, Pfeile zwischen den Einweisungen wegzulassen
$personal_info{Flintstone}{SPOUSE}
Das ist eine Menge Tippen, wenn Sie mehr über Fred erfahren möchten, also können Sie eine Referenz als Art von Cursor erhalten:
$fred = $personal_info{Flintstone};
print "Fred's wife is $fred->{SPOUSE}\n";
Da $fred
Im Snippet oben befindet sich ein Hashref, der Pfeil ist notwendig. Wenn Sie es auslassen, aber mit Bedacht aktiviert sind use strict
Um diese Art von Fehlern zu fangen, beschwert sich der Compiler:
Global symbol "%fred" requires explicit package name at ...
Perl -Referenzen ähneln den Zeigern in C und C ++, aber sie können niemals null sein. Die Zeiger in C und C ++ erfordern Derferencen, ebenso wie Referenzen in Perl.
Die C- und C ++ -Funktionsparameter haben Pass-by-Wert-Semantik: Sie sind nur Kopien, sodass Änderungen nicht zum Anrufer zurückkehren. Wenn Sie die Änderungen sehen möchten, müssen Sie einen Zeiger übergeben. Sie können diesen Effekt mit Referenzen in Perl erhalten:
sub add_barney {
my($personal_info) = @_;
$personal_info->{Rubble} = {
FIRST => "Barney",
SPOUSE => "Betty",
};
}
add_barney \%personal_info;
Ohne den Backslash, add_barney
Hätte eine Kopie bekommen, die weggeworfen wurde, sobald das Sub zurückkehrt.
Beachten Sie auch die Verwendung des "Fat Comma" (=>
) Oben. Es ist autoquotiert die Zeichenfolge links und macht Hash -Initialisierungen weniger syntaktisch laut.
Andere Tipps
Das Folgende zeigt, wie Sie einen Hash und eine Hash -Referenz verwenden können:
my %hash = (
toy => 'aeroplane',
colour => 'blue',
);
print "I have an ", $hash{toy}, " which is coloured ", $hash{colour}, "\n";
my $hashref = \%hash;
print "I have an ", $hashref->{toy}, " which is coloured ", $hashref->{colour}, "\n";
Siehe auch PERLDOC PERLDSC.
Ein Hash ist ein grundlegender Datentyp in Perl. Es verwendet Schlüssel, um auf seinen Inhalt zuzugreifen.
Ein Hash -Ref ist eine Abkürzung auf einen Hinweis auf einen Hash. Referenzen sind Skalare, das sind einfache Werte. Es ist ein skalarer Wert, der im Wesentlichen einen Zeiger auf den tatsächlichen Hash selbst enthält.
Verknüpfung: Unterschied zwischen Hash und Hash Ref in Perl -Ubuntu -Foren
Ein Unterschied liegt auch in der Syntax zum Löschen. Wie C funktioniert Perl für Hashes wie diese:
delete $hash{$key};
und für Hash -Referenzen
delete $hash_ref->{$key};
Das Perl Hash Howto ist eine großartige Ressource, um Hashes gegen Hash mit Hash -Referenzen zu verstehen
Es gibt auch einen weiteren Link Hier hat das weitere Informationen zu Perl und Referenzen.
Sehen PERLDOC Perlreftut Dies ist auch in der Befehlszeile Ihres eigenen Computers zugänglich.
Eine Referenz ist ein skalarer Wert, der sich auf ein ganzes Array oder einen ganzen Hash (oder auf alles andere) bezieht. Namen sind eine Art von Referenz, mit der Sie bereits vertraut sind. Denken Sie an den Präsidenten der Vereinigten Staaten: eine chaotische, unbequeme Beutelblutung und Knochen. Aber um über ihn zu sprechen oder ihn in einem Computerprogramm zu vertreten, brauchen Sie nur die einfache, bequeme skalare Saite "Barack Obama".
Referenzen in Perl sind wie Namen für Arrays und Hashes. Sie sind Perls private, interne Namen, sodass Sie sicher sein können, dass sie eindeutig sind. Im Gegensatz zu "Barack Obama" bezieht sich eine Referenz nur auf eine Sache, und Sie wissen immer, worauf sie sich bezieht. Wenn Sie einen Verweis auf ein Array haben, können Sie das gesamte Array davon wiederherstellen. Wenn Sie einen Hinweis auf einen Hash haben, können Sie den gesamten Hash wiederherstellen. Die Referenz ist jedoch immer noch ein einfacher, kompakter Skalarwert.