Mehrdimensionale Arrays zeilenweise nach 1. Spalte sortieren

mc_gulasch

Erfahrenes Mitglied
Moin,

mein Prob ist kurz erklärt:

Ich habe ein mehrdimensionales Array der Form
Code:
bba   spalte2   spalte3 ...
aab   spalte2   spalte3 ...
acb   spalte2   spalte3 ...
Die Zeilen der obigen Liste sollen dann nach den Werten der ersten Spalte sortiert werden, so dass das Ergebnis dann lautet
Code:
aab   spalte2   spalte3 ...
acb   spalte2   spalte3 ...
bba   spalte2   spalte3 ...
Leider hab ich heute erst mit Perl angefangen und nicht so wirklich viel Ahnung, was man damit alles feines machen kann (jedenfalls mehr in der Stringverarbeitung als in C ;) )
Danke für Tipps & Links
Gulasch


//EDIT:

Ok, ich hab´s geschafft. War garnicht so einfach, hat aber den Vorteil, da ich die BuchstabenWERTE vergleiche, dass das ganze sogar case-sensitive ist:
Perl:
@matrix_sortiert = sort{&matrixSort}@matrix;


sub matrixSort
{
  my $my_cmp = 0;
  $min = 0;
  if (length($$a[0])>=length($$b[0]))
  {
    $min=length($$b[0]);
  }
  
  else
  {
    $min = length($$a[0]);
  }
  $i=0;

  
  while($i<$min)
  {
   $a_int=ord(substr($$a[0],$i,1));
   $b_int=ord(substr($$b[0],$i,1));

   if($a_int > $b_int)
   {
    $my_cmp= 1;
    goto fin;
   }
   elsif($a_int == $b_int)
   {
    $my_cmp= 0;
   }
   elsif($a_int < $b_int)
   {
    $my_cmp= -1;
    goto fin;
   }

   $i++;
  }
   fin:
  $my_cmp;
}

EDIT 2//
War ein Fehler im Code:
Perl:
  if (length($a[0])>=length($b[0]))

muss natürlich

Perl:
  if (length($$a[0])>=length($$b[0]))
heissen. Oben bereits ausgebessert!
 
Zuletzt bearbeitet:
Das geht auch einfacher:
Code:
my @array = ([qw/bba   spalte2   spalte3 ... /],
       [qw/aab   spalte2   spalte3 .../],
       [qw/acb   spalte2   spalte3 .../]);

for my $line(sort{$a->[0] cmp $b->[0]}@array){
  print join(" ",@$line);
}
 
Zurück