Hallo GwenDragon,
ich habe Deiner Liste im untenstehenden Beispiel ein paar Einträge hinzugefügt, die bei bloßem
sort (wie von Linuxer vorgeschlagen) möglicherweise eine unerwünschte Reihenfolge ergeben, denn vermutlich ist ja gewünscht, dass zunächst je Verzeichnis die darin enthaltenen Dateien, dann die Unterverzeichnisse erscheinen.
Deshalb sollte nach Verzeichnisnamen und Dateinamen (und Erweiterungen) separat sortiert werden.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
use strict;
use warnings;
use List::Util qw(shuffle);
use File::Basename;
print $_->[1] . $_->[0] . $_->[2] for sort { $a->[1] cmp $b->[1] || $a->[0] cmp $b->[0] || $a->[2] cmp $b->[2] } map { [ fileparse($_, qr/\.[^.]*/) ] } shuffle (<DATA>);
__DATA__
/
/abc/
/abc/tes.pl
/abc/test_5
/abc/test_42
/abc/test_foo.txt
/abc/test_foo-2.txt
/abc/test_foo01.txt
/abc/test_foo_1.txt
/abc/test/
/abc/test/z.php4
/abc/test/z.txt
/abc-test/abc
/asdf/
/asdf/123/
/asdf/A/
/asdf/B/
/asdf/B/C/
/asdf/B/C/a.file
/home/
/home/test/
/home/test/asdf/
/home/test/asdf/jklo/
/home/test/asdf/jklo/rstuv2/
/home/test/asdf/jklo/rstuvw11/
/root/config
/root/tmp/
Im
__DATA__-Block stehen die Werte in der wahrscheinlich gewünschten Reihenfolge.
Die Verzeichnisse werden hier unter Umständen auch noch nicht korrekt sortiert:
abc-test sollte wohl eher nach
abc kommen. Dies dürfte nur behebbar sein, indem nach allen Verzeichnisebenen nacheinander sortiert wird, wie in der Lösung von rosti.
Zahlen werden nicht numerisch betrachtet, deshalb kommt
/abc/test_42 vor
/abc/test_5. Der Windows-Explorer hat (seit Windows XP) so eine magische Art, nicht streng alphanumerisch, sondern "numerisch" zu sortieren (per GPO deaktivierbar), hier käme also
/abc/test_5 vor
/abc/test_42. Ich finde das irritierend und ziehe es vor, ggf. führende Nullen zu verwenden.
Vermutlich gibt es noch mehr Schwächen. (Z.B. fehlendes
chomp –
\n wird für
print recycelt.)
HTH
Grüße
payx