2012-04-05 13 views
0

ich Hash meinen Hash von Hashes wie diese hinzufügen versuche:Perl hinzufügen Hash zu Hash von Hashes am Ende

%funkce = (
    "funkce1" => { 
     "file" => "soubor1", 
     "name" => "jmeno1", 
     "varargs" => "args", 
     "rettype" => "navrat", 
     "params" => [ 
       "typ", 
       "typ2" 
      ] 
    }, 
    "funkce2" => { 
     "file" => "soubor2", 
     "name" => "jmeno2", 
     "varargs" => "args", 
     "rettype" => "navrat", 
     "params" => [ 
      "typ", 
      "typ2" 
     ] 
    } 
); 
    $delka = keys %funkce; 
    $funkce{ "funkce" . ($delka + 1)} = { 
     "file" => "soubor3", 
     "name" => "jmeno3", 
     "varargs" => "args", 
     "rettype" => "navrat", 
     "params" => [ 
      "typ", 
      "typ2" 
     ] 
    }; 

Aber es gibt ein Problem. Der letzte Hash wird als erste in% -Funktion hinzugefügt, aber ich möchte es als letzte. Wie kann ich es reparieren? Und ich mache es richtig? Danke

Antwort

1

Hashes garantiert keine Reihenfolge. Sie fragen ihn Hash Ihren Schlüssel, so x > y <=/=> f(x) > f(y)

Wenn Sie einfügen, um garantieren wollen, obwohl ich keinen Grund sehe, ist der Overhead (eines tie), eine Standardmethode einzuführen Tie::IxHash zu verwenden.

Listen haben endet, keine Hashes. Hashes sind eine mathematische Zuordnung von einer Gruppe von Namen oder IDs zu einer Menge von Objekten oder Werten. Wenn wir Hunden die Hundenamen vor Augen halten, können wir zwar die Namen der Hunde alphabetisch ordnen, aber es gibt wirklich keinen "ersten Hund".

Von dem, was Sie zeigen,

push(@funkce 
    , { "file" => "soubor1" 
     , "name" => "jmeno1" 
     , "varargs" => "args" 
     , "rettype" => "navrat" 
     , "params" => [ qw<typ typ2> ] 
     }); 

wird genauso gut funktionieren. Es gibt wenig Gewinn in der Eingabe $funkce{'funcke2'} anstatt $funkce[2] oder $funkce{ '$funkce' . $i } über $funkce[$i]und wenn Sie andere Namen gehen außer zu erhöhen, dann sollten Sie Ihre Abteilung in dieser Art und Weise haben: $funkce{'funkce'}[2] // $funkce{'superfunkce'}[2]

Verwendung von Hashes für diskrete Teile Namen und Arrays für Zahlen ist eine gute Möglichkeit, Ihre Daten zu programmieren. $funkce{'funkce'}[2] ist jedes Bit eine singuläre Einheit als $funkce{'funkce2'}.

+0

Und gibt es so wie kann ich es "reparieren"? Ein Trick? –

+0

@Bibo, * warum * brauchst du es? – Axeman

+1

@Bibo Sie können die Schlüssel immer sortieren, wenn Sie sie wirklich in einer bestimmten Reihenfolge benötigen. – Neil

0

Wenn Sie geordnete Artikel benötigen, verwenden Sie ein Array, wenn Sie möchten, dass benannte (ungeordnete) Artikel einen Hash verwenden. Um etwas in der Nähe von geordneten Hashes zu erhalten, müssen Sie entweder verschachtelte Arrays/Hashes verwenden oder die Hashes sortieren oder eine gebundene Klasse verwenden.

Nesting

@funkce = (
    { name => "funkce1", 
     "file" => "soubor1", 
     "name" => "jmeno1", 
     "varargs" => "args", 
     "rettype" => "navrat", 
     "params" => [ 
       "typ", 
       "typ2" 
      ] 
    }, 
    { name => "funkce2", 
     "file" => "soubor2", 
     "name" => "jmeno2", 
     "varargs" => "args", 
     "rettype" => "navrat", 
     "params" => [ 
      "typ", 
      "typ2" 
     ] 
    } 
); 
push @funkce, { 
    name => "funkce3", 
    "file" => "soubor3", 
    "name" => "jmeno3", 
    "varargs" => "args", 
    "rettype" => "navrat", 
    "params" => [ 
     "typ", 
     "typ2" 
    ] 
}; 

Sortierung

%funkce = (...); # as in OP 

# when using 
foreach my $item (sort keys %funkce) { 
    # do something with $funkce{$item} 
} 

Gebunden

Tie::IxHash sondern als Axeman sagte, werden Sie wahrscheinlich nicht brauchen,/dies wollen.