Von perlfaq4 ‚s Antwort auf How do I sort an array by (anything)?
Versorgung eine Vergleichsfunktion zu sortieren() (in Art in perlfunc beschrieben):
Die Standard-Sortierfunktion ist cmp, String-Vergleich, w das würde sortieren (1, 2, 10) in (1, 10, 2). < =>, oben verwendet, ist der numerische Vergleichsoperator.
Wenn Sie eine komplizierte Funktion benötigen, um den zu sortierenden Teil herauszuziehen, tun Sie es nicht innerhalb der Sortierfunktion. Ziehen Sie es zuerst heraus, weil der Sortierblock mehrmals für dasselbe Element aufgerufen werden kann. Hier ist ein Beispiel, wie man das erste Wort nach der ersten Zahl an jedem Element herauszieht und diese Wörter dann fallunabhängig sortiert.
@idx =();
for (@data) {
($item) = /\d+\s*(\S+)/;
push @idx, uc($item);
}
@sorted = @data[ sort { $idx[$a] cmp $idx[$b] } 0 .. $#idx ];
, die auch auf diese Weise geschrieben werden konnten, einen Trick verwenden, die bekannt sein gekommen ist als die Schwartzian Transformation:
@sorted = map { $_->[0] }
sort { $a->[1] cmp $b->[1] }
map { [ $_, uc((/\d+\s*(\S+)/)[0]) ] } @data;
Wenn Sie auf mehreren Feldern sortieren müssen, ist das folgende Paradigma nützlich.
@sorted = sort {
field1($a) <=> field1($b) ||
field2($a) cmp field2($b) ||
field3($a) cmp field3($b)
} @data;
Dies kann bequem mit Vorberechnung der Schlüssel wie oben angegeben kombiniert werden.
Siehe Art Artikel in der „weit mehr als Sie jemals wissen wollten“ diesen Ansatz in http://www.cpan.org/misc/olddoc/FMTEYEWTK.tgz für mehr Sammlung.
Siehe auch die Frage später in perlfaq4 auf Sortierung Hashes.
Ich mag die Kürze! – Zaid
Sie sollten jedoch die Schwartzsche Transformation durchführen, damit Sie die vergleichbaren Teile nicht zweimal für jedes Element neu berechnen müssen. Vor allem, wenn das Format nicht starr ist. – dlamblin
Vorzeitige Optimierung ist die Wurzel allen Übels. Meinst du nicht, dass "substr" so schnell oder schneller sein wird wie ein Hash-Lookup? – jrockway