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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top