Wie kann ich erstellen und anonymen Hashes zu einem bekannten Hash während der Skriptausführung hinzuzufügen?

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

Frage

Ich werde versuchen, dies mit einem Beispiel zu illustrieren. Nehmen Sie ein typisches Beispiel für einen Hash von Hashes:

my %HoH = (
    flintstones => {
        lead => "fred",
        pal  => "barney",
    },
    jetsons => {
        lead      => "george",
        wife      => "jane",
        "his boy" => "elroy",
    },
    simpsons => {
        lead => "homer",
        wife => "marge",
        kid  => "bart",
    },
);

Für meine Zwecke würde Ich mag die Lage sein, einen unbenannte oder anonymen Hashes% HOH hinzuzufügen. Ich werde nicht brauchen (oder kann) diesen Teil Hashes erst zur Laufzeit definieren. Wie kann ich erreichen dies mit Perl?

Alles, was ich gelesen habe (und ich habe durch Perldocs und Google'd bereits) scheint Beispiele zu zeigen, wo alle Unter hahes (zB „Familie Feuerstein“, „jetsons“ und „simpsons“) definiert sind.

Was ich tue, versuche, eine übergeordnete Hash zu erstellen, die Sub-Hashes mit Zeilen aus einer CSV-Datei enthalten:

%TopHash = (
   %Line1 => {
      cell01 => $some_value1a;
      cell02 => $some_value2a;
      cell03 => $some_value3a;
   },
   %Line2 => {
      cell01 => $some_value1b;
      cell02 => $some_value2b;
      cell03 => $some_value3b;
   },
   %Line3 => {
      cell01 => $some_value1c;
      cell02 => $some_value2c;
      cell03 => $some_value3c;
   },
# etc
# etc
# etc

    );

Die Anzahl der „% LineX“ Hashes, die ich brauche ist erst zur Laufzeit bekannt (weil sie die Anzahl der Zeilen in einer CSV darstellen, die zur Laufzeit gelesen wird).

Irgendwelche Ideen? Wenn es nicht schon klar ... Ich bin immer noch versuche, meinen Kopf zu wickeln um Perl-Hashes.

War es hilfreich?

Lösung

Zuerst erstellen Sie den Hash aus der aktuellen Zeile Sie Parsen

my %lineHash = (
    cell01 => $some_value1a,
    cell02 => $some_value1b,
    cell03 => $some_value1c
);

oder eine Referenz auf einen Hash erstellen geradezu

my $lineHashRef = {
    cell01 => $some_value2a,
    cell02 => $some_value2b,
    cell03 => $some_value2c
};

Dann fügen Sie es zu Ihrem gesamten Hash, daran erinnern, dass verschachtelte Perl-Strukturen nur Verweise auf die anderen Strukturen enthalten.

$topHash{line1} = \%lineHash;
$topHash{line2} = $lineHashRef;

Aktualisiert Beispiel eine Schleife über ein Array von Daten parsen gegeben

my %topHash;
foreach my $i (0 .. $#data) {
    my %tempHash;
    // stuff here to parse $data[$i] and populate %tempHash
    $topHash{"line$i"} = \%tempHash;
}

Andere Tipps

Um einen anonymen Hash zur Laufzeit hinzufügen, weisen Sie, wie Sie ein normales Hashelement:

$HoH{key} = { foo => 42 };

oder

$HoH{key} = $hash_ref;

oder

$HoH{key} = \%hash;
#!/usr/bin/perl

use strict;

my %HoH = (
    line01 => {
        cell01 => "cell0101",
        cell02 => "cell0102",
        cell03 => "cell0103"
    }
);

$HoH{"line02"}    =
    {
        cell01 => "cell0201",
        cell02 => "cell0202",
        cell03 => "cell0203"
    };

foreach my $hohKey (keys %HoH)
{
    my $newHash = $HoH{$hohKey};
    print "Line Name: $hohKey\n";
    foreach my $key (keys %$newHash)
    {
        print "\t$key => ", $newHash->{$key}, "\n";
    }
}

Jedesmal, wenn man von einer Reihe von Daten, die einen neuen Hash erstellen, müssen Sie einen eindeutigen Schlüssel denken, dass die Daten in Ihrer Top-Hash-Tabelle zu speichern.

my $line = 1;
my %HoH;
while (<>) {
    my ($cell01, $cell02, $cell03, @etc) = split /,/;
    my $newHash = { cell01 => $cell01, cell02 => $cell02, ... };
    my $key = "line$line";
    $HoH{$key} = $newHash;
    $line++;
}

Jetzt keys(%HoH) kehrt eine (unsortiert) Liste wie "line1","line2","line3",....
$HoH{"line5"} würde einen Verweis auf die Daten für die fünfte Zeile der Datei zurück.
%{$HoH{"line7"}} ist eine Art hässliche Syntax, aber es gibt eine Hash-Tabelle Ihrer Daten von der Linie 7.
$HoH{"line14"}{"cell02"} verwendet werden könnte, zu einem bestimmten Teil der Daten zu erhalten.

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