Anzeige:
Ergebnis 1 bis 5 von 5

Thema: [Perl] Problem mit interner Sortierung von Hashes

  1. #1
    Registrierter Benutzer Avatar von Rebell
    Registriert seit
    10.07.2002
    Ort
    Dresden
    Beiträge
    62

    [Perl] Problem mit interner Sortierung von Hashes [gelöst]

    Hallo.

    Ich hab ein Problem damit, dass Perl die Hashes intern umsortiert ohne eine Möglichkeit die vorgegebene Reihenfolge zurück zu bekommen.

    Beispiel:
    Code:
    my %werte = ("kuh", "muh", "katze", "miau", "hund", "wau", "broiler", "puttputt");
    foreach my $key (keys(%werte)) {
        print $key . "=>" . $werte{$key} . "\n";
    }
    print "---\n";
    while (my ($key, $value) = each %werte) {
        print $key . "=>" . $value . "\n";
    }
    Zitat Zitat von Ausgabe
    hund=>wau
    kuh=>muh
    broiler=>puttputt
    katze=>miau
    ---
    hund=>wau
    kuh=>muh
    broiler=>puttputt
    katze=>miau
    Kann ich das irgendwie über ein Parameter oder interne Einstellung verhindern?
    Einen Workarround mit Arrays zu schreiben hab ich versucht, ist aber Geschwindigkeitstechnisch nicht vertretbar.
    Geändert von Rebell (23-08-2006 um 20:31 Uhr)
    to be famous is so nice
    http://get-mike.de
    M:ke

  2. #2
    Registrierter Benutzer
    Registriert seit
    19.08.2004
    Beiträge
    404
    Ich hab ein Problem damit, dass Perl die Hashes intern umsortiert ohne eine Möglichkeit die vorgegebene Reihenfolge zurück zu bekommen.
    Hi,

    umsortiert ist nicht ganz richtig... Ein Hash ist in Perl uNsortiert . Die Reihenfolge der Elemente ist immer willkürlich.

    Du kannst Dich aber selber um die Sortierung kümmern.

    Alphanumerisch:
    Code:
    my %Hash = (
      'hund' => 'wau',
      'katze' => 'miau',
      'kuh' => 'muh'
    );
    
    foreach(sort(keys(%Hash)))
    {
      print "$_ => $Hash{$_}\n";
    }
    oder nach Index:
    Code:
    my %Hash = (
      'hund'  => { 'index' =>  0,  'value' => 'wau'  },
      'katze' => { 'index' =>  1,  'value' => 'miau' },
      'kuh'   => { 'index' =>  2,  'value' => 'muh'  }
    );
    
    foreach( sort {$Hash{$a}{'index'} cmp $Hash{$b}{'index'}} keys(%Hash))
    {
      print "$_ macht $Hash{$_}{'value'} \n";
    }
    Wobei Du Dich um den Wert des Index selber kümmern musst... der wird nicht automatisch erzeugt, wie beispielsweise beim Füllen eines Arrays Hier wäre dann aber sichergestellt (vorausgesetzt, der Index ist richtig), dass alle Elemente in der Reihenfolge ausgegeben werden, wie sie auch zugewiesen wurden.

    ...was übrigens nichts an der Tatsache ändert, dass das Hash intern immernoch unsortiert ist.

    hth, michael

  3. #3
    Registrierter Benutzer Avatar von Rebell
    Registriert seit
    10.07.2002
    Ort
    Dresden
    Beiträge
    62
    Ja, das dachte ich mir schon. Ich bin es nur von PHP und Javascript gewöhnt, dass das Hash so bleibt wie ichs erzeugt habe.

    Aber interessante Zeile die du da geschrieben hast mit sort() und keys(). Ist das eine Art Pipe-Funktionalität? Das cmp sorgt für die automatisch Sortierung nehm ich an?
    to be famous is so nice
    http://get-mike.de
    M:ke

  4. #4
    Registrierter Benutzer
    Registriert seit
    19.08.2004
    Beiträge
    404
    Ist das eine Art Pipe-Funktionalität?
    Das ist eher ein zusammenhängender Funktionsaufruf von sort().

    sort() kannst Du zwei Argumente übergeben. Die Sortierroutine und die Liste von Elementen, die sortiert werden soll.

    Kurz geschrieben wäre der Aufruf eigentlich so:

    Code:
    @SortiertesArray = sort( {CODEBLOCK} , @UnsortiertesArray);
    keys() wiederum ist eine Funktion, die eine Liste aller Schlüssel aus dem Hash zurückgibt. Das Pendant wäre dann values()

    Mehr dazu findest Du mit

    perldoc -f sort
    perldoc -f keys

  5. #5
    Registrierter Benutzer
    Registriert seit
    05.02.2006
    Beiträge
    116
    Zitat Zitat von Rebell
    Ja, das dachte ich mir schon. Ich bin es nur von PHP und Javascript gewöhnt, dass das Hash so bleibt wie ichs erzeugt habe.
    [...]
    Dafür könntest Du das Modul Tie::IxHash verwenden...

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •