wake-up-neo.net

Was ist der Unterschied zwischen einem Hash und einer Hash-Referenz in Perl?

Ich möchte Hashes in Perl richtig verstehen. Ich musste Perl zeitweise für einige Zeit verwenden und meistens, wenn ich es tun muss, hängt es hauptsächlich mit der Textverarbeitung zusammen.

Und jedes Mal, wenn ich mit Hashes zu tun habe, wird es vermasselt. Ich finde die Syntax für Hashes sehr kryptisch

Eine gute Erklärung von Hashes und Hash-Referenzen, deren Unterschieden, wann immer sie benötigt werden usw. wäre sehr willkommen.

61
user855

Ein einfacher Hash befindet sich in der Nähe eines Arrays. Ihre Initialisierungen sehen sogar ähnlich aus. Zuerst das Array:

@last_name = (
  "Ward",   "Cleaver",
  "Fred",   "Flintstone",
  "Archie", "Bunker"
);

Stellen wir nun die gleichen Informationen mit einem Hash dar (auch bekannt als assoziatives Array):

%last_name = (
  "Ward",   "Cleaver",
  "Fred",   "Flintstone",
  "Archie", "Bunker"
);

Obwohl sie den gleichen Namen haben, ist das Array @last_name und der Hash %last_name sind völlig unabhängig.

Wenn wir mit dem Array den Nachnamen von Archie kennen 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 syntaktisch viel direkter:

print "Archie $last_name{Archie}\n";

Angenommen, wir möchten Informationen mit einer nur geringfügig reicheren Struktur darstellen:

  • Hackmesser (Nachname)
    • Ward (Vorname)
    • June (Vorname des Ehepartners)
  • Feuerstein
    • Fred
    • Wilma
  • Bunker
    • Archie
    • Edith

Bevor Referenzen hinzukamen, waren flache 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 sind die Schlüssel und Werte von %personal_info sind alle Skalare, aber die Werte sind eine spezielle Art von Skalar: Hash-Referenzen, erstellt mit {}. Mit den Referenzen können wir "mehrdimensionale" Hashes simulieren. Zum Beispiel können wir über nach Wilma gelangen

$personal_info{Flintstone}->{SPOUSE}

Beachten Sie, dass wir in Perl Pfeile zwischen den Indizes weglassen können

$personal_info{Flintstone}{SPOUSE}

Wenn Sie mehr über Fred erfahren möchten, müssen Sie viel tippen, um eine Referenz als eine Art Cursor zu erhalten:

$fred = $personal_info{Flintstone};
print "Fred's wife is $fred->{SPOUSE}\n";

Weil $fred im obigen Snippet ist ein Hashref, der Pfeil ist notwendig. Wenn Sie es weglassen, aber mit Bedacht aktiviert use strict Damit Sie diese Art von Fehlern erkennen können, beschwert sich der Compiler über Folgendes:

Global symbol "%fred" requires explicit package name at ...

Perl-Referenzen sind Zeigern in C und C++ ähnlich, können jedoch niemals null sein. Zeiger in C und C++ erfordern eine Dereferenzierung, ebenso Verweise in Perl.

C- und C++ - Funktionsparameter haben eine Semantik für die Übergabe von Werten: Sie sind nur Kopien, sodass Änderungen nicht an den Aufrufer zurückgegeben werden. Wenn Sie die Änderungen sehen möchten, müssen Sie einen Zeiger übergeben. Sie können diesen Effekt mit Referenzen in Perl erzielen:

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 erhalten, die weggeworfen wurde, sobald das Sub zurückkehrt.

Beachten Sie auch die Verwendung des "fetten Kommas" (=>) über. Die Zeichenfolge auf der linken Seite wird automatisch in Anführungszeichen gesetzt, und Hash-Initialisierungen werden syntaktisch weniger verrauscht.

87
Greg Bacon

Im Folgenden wird veranschaulicht, 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 .

16

Ein Hash ist ein grundlegender Datentyp in Perl. Es verwendet Schlüssel, um auf seinen Inhalt zuzugreifen.

Eine Hash-Referenz ist eine Abkürzung für eine Referenz auf einen Hash. Referenzen sind Skalare, also einfache Werte. Es ist ein skalarer Wert, der im Wesentlichen einen Zeiger auf den eigentlichen Hash selbst enthält.

Link: nterschied zwischen Hash und Hash Ref in den Perl - Ubuntu Foren

Ein Unterschied besteht auch in der Syntax zum Löschen. Perl funktioniert wie C für Hashes wie folgt:

delete $hash{$key};

und für Hash-Referenzen

delete $hash_ref->{$key};

Das Perl Hash Howto ist eine großartige Ressource, um Hashes im Vergleich zu Hashes mit Hash-Referenzen zu verstehen

Es gibt auch einen anderen Link hier finden Sie weitere Informationen zu Perl und Referenzen .

10
user195488

Siehe perldoc perlreftut , auf das Sie auch über die Befehlszeile Ihres eigenen Computers zugreifen können.

Eine Referenz ist ein Skalarwert, der sich auf ein gesamtes Array oder einen gesamten Hash (oder auf fast alles andere) bezieht. Namen sind eine Art Referenz, mit der Sie bereits vertraut sind. Denken Sie an den Präsidenten der Vereinigten Staaten: eine unordentliche, unbequeme Tüte mit Blut und Knochen. Aber um über ihn zu sprechen oder ihn in einem Computerprogramm darzustellen, brauchen Sie nur die einfache, praktische Skalarsaite "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 daraus wiederherstellen. Wenn Sie einen Verweis auf einen Hash haben, können Sie den gesamten Hash wiederherstellen. Die Referenz ist jedoch immer noch ein einfacher, kompakter Skalarwert.

7
Sinan Ünür