Sven: Opendir Ausgabe sortieren

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

  1. 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

    --
    ><o(((°>           ><o(((°>
       <°)))o><                     ><o(((°>o
    Der Valigator leibt diese Fische
    1. 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;  
          }  
      }  
      
      
      1. 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

        --
        ><o(((°>           ><o(((°>
           <°)))o><                     ><o(((°>o
        Der Valigator leibt diese Fische
        1. 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

          1. 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