Schnaps: Zweidimensionales Hash sortieren

Hallo zusammen

ich habe hier ein zweidimensionales Hash das so aussieht.

$neu_alignment{'name1'}{'0'}=a
$neu_alignment{'name2'}{'0'}=c
$neu_alignment{'name3'}{'0'}=-
$neu_alignment{'name4'}{'0'}=-
$neu_alignment{'anzahl'}{'0'}=1

$neu_alignment{'name1'}{'1'}=a
$neu_alignment{'name2'}{'1'}=a
$neu_alignment{'name3'}{'1'}=a
$neu_alignment{'name4'}{'1'}=a
$neu_alignment{'anzahl'}{'1'}=4

$neu_alignment{'name1'}{'2'}=a
$neu_alignment{'name2'}{'2'}=b
$neu_alignment{'name3'}{'2'}=b
$neu_alignment{'name4'}{'2'}=t
$neu_alignment{'anzahl'}{'2'}=2

Da sind jeweils Spalten aus einer Tabelle drin.
ich möchte das nun so ausgeben lassen das die Spalte mit dem höchsten Wert bei 'anzahl' hat zuerst gezeigt wird und dann die anderen dahinter.

Also so:

name1     a | a | a

name2     a | b | c

name3     a | b | -

name4     a | t | -

Ich stecke gerade etwas fest, hoffe das mir einer von euch helfen kann.

MFG
Schnaps

  1. Hi, mach einen Bubbelsort...

    $anzahl_saetze = count($neu_alignment{'anzahl'});
    for($i=0; $i<$anzahl_saetze; $i++) {
        for($j=$anzahl_saetze-$i; $j>0; $j--) {
            if($neu_alignment{'anzahl'}{$j-1} > $neu_alignment{'anzahl'}{$j} ) {
                $temp{'name1'} = $neu_alignment{'name1'}{$j-1};
                $temp{'name2'} = $neu_alignment{'name2'}{$j-1};
                $temp{'name3'} = $neu_alignment{'name3'}{$j-1};
                $temp{'name4'} = $neu_alignment{'name4'}{$j-1};
                $temp{'anzahl'} = $neu_alignment{'anzahl'}{$j-1};

    $neu_alignment{'name1'}{$j-1} = $neu_alignment{'name1'}{$j};
                $neu_alignment{'name2'}{$j-1} = $neu_alignment{'name2'}{$j};
                $neu_alignment{'name3'}{$j-1} = $neu_alignment{'name3'}{$j};
                $neu_alignment{'name4'}{$j-1} = $neu_alignment{'name4'}{$j};
                $neu_alignment{'anzahl'}{$j-1}= $neu_alignment{'anzahl'}{$j};

    $neu_alignment{'name1'}{$j} = $temp{'name1'};
                $neu_alignment{'name2'}{$j} = $temp{'name2'};
                $neu_alignment{'name3'}{$j} = $temp{'name3'};
                $neu_alignment{'name4'}{$j} = $temp{'name4'};
                $neu_alignment{'anzahl'}{$j}= $temp{'anzahl'};
            }
        }
    }

    Hinweis: Nur Ansatz, keine Funktionsprüfung :o)

    Gruss
    Stefan

    1. danke schon mal für deine Hilfe

      Die einzelnden Namen werden bei mir aber immer dynamisch erzeugt, also es sind nicht immer nur die 4 Beispiel Namen.

      ich wollte dein Script dann durch die entsprechenden foreach Schleifen ersetzen, tuhe mich aber doch sehr schwer damit.

      for(my $i=0; $i<$anzahl_saetze; $i++) {
          for(my $j=$anzahl_saetze-$i; $j>0; $j--) {
              if($neu_alignment{'anzahl'}{$j-1} > $neu_alignment{'anzahl'}{$j} ) {

      foreach my $test(%neu_alignment) {
                  $temp{$test} = $neu_alignment{$test}{$j-1};
                  }

      foreach my $test{%neu_alignment) {
                  $neu_alignment{$test}{$j-1} = $neu_alignment{$test}{$j};
                  }

      foreach my $test{%neu_alignment) {
                  $neu_alignment{$test}{$j} = $temp{$test};
                  }
              }
          }
      }

      Kann da bitte noch mal einer drüber schauen.

      MFG
      Schnaps

      Gruss
      Stefan

  2. Hallo Schnaps

    Hallo zusammen

    ich habe hier ein zweidimensionales Hash das so aussieht.

    $neu_alignment{'name1'}{'0'}=a
    $neu_alignment{'name2'}{'0'}=c
    $neu_alignment{'name3'}{'0'}=-
    $neu_alignment{'name4'}{'0'}=-
    $neu_alignment{'anzahl'}{'0'}=1

    Deine Datenstruktur ist sehr fragwürdig.

    Wenn du name1 bis name4 hast klingt das doch stark nach einem Array und der 2. Schlüssel sowieso. 0, 1, 2 das ist ein Array.

    Vielleicht wäre alle einfacher, wenn du die Struktur sinnvoll änderst.

    #!/usr/bin/perl -w

    use strict;
    use Data::Dumper;

    my $alignment = [
    {
      name1 => 'a',
      name2 => 'c',
      name3 => '-',
      name4 => '-',
      anzahl => 1
    },
    {
      name1 => 'a',
      name2 => 'a',
      name3 => 'a',
      name4 => 'a',
      anzahl => 4
    },
    {
      name1 => 'a',
      name2 => 'b',
      name3 => 'b',
      name4 => 't',
      anzahl => 2
    }
    ];
    use Data::Dumper;

    foreach( reverse sort { $a->{anzahl} <=> $b->{anzahl} } @$alignment)
    {
       print Dumper $_;
    }

    Struppi.