Calocybe: Sortierproblem

Beitrag lesen

Hi!

@daten = sort {x($a) <=> x($b)} @daten;

sub x
{
     ($nicht1,$nicht2,$nicht3,$wichtig,..) = split(/,/,$daten[ ??? ]);
     $a = $wichtig;
}

  1. Die Funktion wird von sort() mit einem (skalaren) Parameter aufgerufen. Auf den mußt Du zugreifen, nicht auf @daten.

Sagen wir's doch einfach auf Deutsch:
sub x {
    my $line = shift;
    my $wichtig;

(undef, undef, undef, $wichtig, undef) = split(/,/, $line);
    return $wichtig;
}

  1. Und ihr Ergebnis muß sie nicht an $a zuweisen (eine solche Variable existiert m. E. gar nicht - in welchem scope auch? Das ist nur eine symbolische Notation),

Doch doch, die existiert tatsaechlich. $a und $b sind globale Variablen im aktuellen package. Die Perl-Erfinder haben diesen Weg aus Geschwindigkeitsgruenden gewaehlt. See also perldoc->perlfunc->sort.

Um noch etwas mehr Geschwindigkeit rauszukitzeln, kann man vielleicht die sub x ganz weglassen und stattdessen einfach
  @daten = sort { (split(/,/, $a))[3] <=> (split(/,/, $b))[3] } @daten;
schreiben. Falls die einzelnen Felder in jeder Zeile dieselbe Laenge haben, kann man statt split() auch substr() verwenden, was wahrscheinlich noch schneller wird.

So long