Thread Dateisortierung (39 answers)
Opened by IceRage at 2012-02-04 02:17

pq
 2012-02-04 14:57
#155856 #155856
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
2012-02-04T13:27:42 GUIfreund
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
opendir(DIR,$directory);

my @files = map {
    $_->[1]
} sort {
    $b cmp $a
} map {
    ["$directory/$_", $_]
} (readdir DIR);
print "$_\n" foreach @files;


das ist ziemlich sinnfrei.

zunächst einmal braucht man eine schwartzsche transformation nicht, nur um "$directory/$_" zu vergleichen. das dürfte im direkten vergleich genauso schnell sein. wenn man also die ST nicht sowieso anwendet, kann man sie hier weglassen.
zweitens vergleichst du in sort $a und $b, aber $a und $b sind array-referenzen, da wirst du also eher was zufälliges rausbekommen.
drittens ist es wohl egal, ob man "$dir/$_" vergleicht oder $_. das voranstellen von $dir hat ja keinen einfluss auf die sortierung, da $dir ja immer gleich ist.

Quote
Wenn du Ordner und Dateien getrennt haben willst, wirst du zwei Durchläufe brauchen.

warum das?

Code (perl): (dl )
1
2
3
4
5
6
7
8
# verzeichnis/datei, änderungsdatum
my @files = map {
    $_->[2]
} sort {
    $b->[0] <=> $a->[0] or $b->[1] <=> $a->[1]
} map {
    [-d "$dir/$_" || 0, -M "$dir/$_", $_]
} readdir $dh;


in die arrayref wird geschrieben:
-d: ob directory (dann 1) oder nicht (0)
-M: wie lange die letzte änderung her ist
und der dateiname selbst

in sort wird dann der erste eintrag verglichen, d.h. verzeichnisse kommen immer zuerst. danach wird nach änderungsdatum verglichen. oder was immer man möchte.

Code (perl): (dl )
1
2
3
4
5
6
7
8
# verzeichnis/datei, alphanumerisch
my @files = map {
    $_->[1]
} sort {
    $b->[0] <=> $a->[0] or $b->[1] cmp $a->[1]
} map {
    [-d "$dir/$_" || 0, $_]
} readdir $dh;


mit sort kann man ziemlich vieles anstellen. der code, den man da schreibt, liefert einfach nur -1, 0 oder 1 zurück, das ist alles, was sort() braucht.

warum also nicht zwei vergleiche oder mehr verknüpfen?
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem

View full thread Dateisortierung