Opendir Ausgabe sortieren
Sven
- perl
Hallo zusammen
Ich lese mit dieser Funktion ein Verzeichnis ein:
opendir(DIR, ".") or die "access denied to $dir";
my @Verzeichnisinhalt = grep {!/^./} sort readdir(DIR);
closedir(DIR);
Soweit schön und gut. Wenn ich nun den Inhalt von @Verzeichnisinhalt ausgebe, ist dieser zwar alphabetisch sortiert, jedoch sind Ordner und Dateien gemischt.
Ich habe nun alles Mögliche durch gelesen, jedoch finde ich die Funktion nicht, welche mir die Ausgabe so sortiert, dass zuerst alle Ordner in alphabetischer und dann alle Dateien in alphabetischer Reihenfolge ausgegeben werden.
Hat da jemand ein Tipp für mich? Wäre sehr dankbar.
Grüsse Sven
opendir(DIR, ".") or die "access denied to $dir";
uh böse. WTF ist gerade '.'
my @Verzeichnisinhalt = grep {!/^./} sort readdir(DIR);
closedir(DIR);
Ich habe nun alles Mögliche durch gelesen, jedoch finde ich die Funktion nicht, welche mir die Ausgabe so sortiert, dass zuerst alle Ordner in alphabetischer und dann alle Dateien in alphabetischer Reihenfolge ausgegeben werden.
iteriere über die Liste und mache die entsprechenden Filetests.
katalogisiere $_ über einen Hash, dessen Keys du sortieren kannst.
Je nach Absicht willst du eh erweiterte Filetests vornehmen.
Du willst vor allem nicht versehentlich Files exekutieren, die zwar wie Textfiles benannt sind, sich aber als EXEs oder Shortcuts verhalten.
mfg Beat
Du ermutigst einen Neuling, *noch* einen amateurhaft geschriebenen Verzeichnisleser in die Welt zu setzen. Trotz Selfgedanke: nein danke!
Wir haben das Problem schon gründlich, korrekt und ohne Sicherheitslücken gelöst und tausendfach getestet, und sollten unsere Energie darauf verwenden, uns interessanten und vor allem ungelösten Problemen zuzuwenden.
use File::Next qw();
my $target_directory = $ENV{HOME}; # beispielsweise
my $options = {
descend_filter => sub {0}, # niemals in Unterverzeichnisse abtauchen
file_filter => sub {!/\A [.]/msx}, # Dotfiles ignorieren
follow_symlinks => 1,
sort_files => 1, # Standardsortierung
};
for my $file_system_feature (qw(dirs files)) {
my $iterator = File::Next->can($file_system_feature)->($options, $target_directory);
while (defined(my $name = $iterator->())) {
say $name;
}
}
Du ermutigst einen Neuling, *noch* einen amateurhaft geschriebenen Verzeichnisleser in die Welt zu setzen. Trotz Selfgedanke: nein danke!
interessant...
Wir haben das Problem schon gründlich, korrekt und ohne Sicherheitslücken gelöst und tausendfach getestet, und sollten unsere Energie darauf verwenden, uns interessanten und vor allem ungelösten Problemen zuzuwenden.
Ja wir warten gespannt darauf, dass du die Probleme löst, die dein geposteter Code aufwirft.
Was soll
descend_filter => sub {0},
Was hast du dir gedacht bei
file_filter => sub {!/\A [.]/msx},
willst du das?
follow_symlinks => 1,
woher nimmst du das vertrauen für
my $target_directory = $ENV{HOME};
???
nice problems.
Ich sehe da Nachholbedarf für ein paar Grundlagen.
mfg Beat
Wer Doku lesen kann, ist klar im Vorteil.
Was soll
descend_filter => sub {0},
readdir liest nur das eine angegebene/vorbereitete Verzeichnis, das dürfte dir bekannt sein; File::Next taucht standardmäßig ab, was ja auch vernünftig ist, da das im Normalfall viel nützlicher ist. Dieses Merkmal habe ich unterbunden, um möglichst nahe bei den Umständen des Fragenden zu bleiben.
Was hast du dir gedacht bei
file_filter => sub {!/\A [.]/msx},
Was hat sich der Fragende bei grep {!/^\./}
gedacht? Richtig, er will Dotfiles filtern. AUẞERDEM IST DAS SCHON SO DORT IN MEINEM POSTING KOMMENTIERT, DU KLOTZ MIT LÖCHERN. Erst weglöschen und dann dumm fragen? Meine Fresse…
willst du das?
follow_symlinks => 1,
Ja, will man im Normalfall. Ich gebe es explizit an, damit sich der Fragende dieses gerne unterschlagenen „corner case“ bewusst wird, und sollte er es wider Erwarten nicht brauchen, leicht abschalten kann.
woher nimmst du das vertrauen für
my $target_directory = $ENV{HOME};
Ist ein Beispiel. WAR AUCH SCHON SO BEREITS KOMMENTIERT.
Ich sehe da Nachholbedarf für ein paar Grundlagen.
o_O ja, ne, is klar
Hallo Sven
Herzlichen Dank für Deine tolle Antwort! Du warst mir eine echte Hilfe. Genau so was habe ich gesucht.
Wenn ich mit Doku lesen weiter gekommen wäre, hätte ich ja kaum Hilfe hier gesucht, das hast Du vollkommen richtig angemerkt.
Nochmals Danke und lieben Gruss
Sven