2016-06-13 11 views
0

Ich erhielt ein Perl-Skript, das derzeit eine Liste von Verzeichnissen aus einer Textdatei liest und speichert sie in einem Zeichenfolge-Vektor. Ich möchte es so ändern, dass es die Namen aller Verzeichnisse im aktuellen Ordner liest und sie im Vektor speichert. Auf diese Weise muss der Benutzer die Eingabedatei nicht jedes Mal ändern, wenn sich die Liste der Verzeichnisse im aktuellen Ordner ändert.Speichern Sie die Liste der Verzeichnisse in einem Array

Ich habe keine Kenntnisse von Perl, abgesehen davon, dass es aussieht wie Array-Indizes in Perl von 0 (wie in Python). Ich habe Grundkenntnisse in bash und Python, aber ich möchte das Skript in Python nicht von Grund auf neu schreiben. Es ist ein langes, komplexes Skript und ich bin mir nicht sicher, ob ich es in Python umschreiben könnte. Kannst du mir helfen? Hier ist der Teil des Skripts, die zur Zeit ist das Lesen der Textdatei:

#!/usr/bin/perl 
use Cwd; 
. 
. 
. 
open FILES, "<files.txt" or die; # open input file 
<FILES> or die;    # skip a comment 
my $nof = <FILES> or die; # number of directories 
<FILES> or die;    # skip a comment 
my @massflow;    # read directories 
for (my $i = 0; $i < $nof; $i++){ 
    chomp($massflow[$i] = <FILES>); 
} 
. 
. 
. 
close(FILES); 

PS Ich denke, das Skript ist ziemlich selbsterklärend, aber nur um sicher zu sein, öffnet sich dieses Stück eine Textdatei namens „files.txt ", überspringt eine Zeile, liest die Anzahl der Verzeichnisse, überspringt eine andere Zeile und liest, einen Namen für jede Zeile, die Namen aller Verzeichnisse im aktuellen Ordner, wie in" files.txt "geschrieben.

EDIT schrieb ich dieses Skript folgende @Sobrique Vorschlag, aber es enthält auch Dateien, nicht nur dirs:

#!/usr/bin/perl 
use Cwd; 

my @flow = glob ("*"); 

my $arrSize = @flow; 
print $arrSize; 
for (my $i = 0; $i < $arrSize; $i++){ 
    print $flow[$i], "\n"; 
} 
+2

Es sieht aus wie ein sehr alter Perl-Skript, mit, was heutzutage als schlechte Gewohnheiten kombiniert mit Baby-perl. (Füge 'use strict;' und 'use warnies;' zu Beginn hinzu. Der open-Befehl ist nicht so wie wir es heute machen. (Siehe perldoc -f open) Die Schleife zum Lesen der Datei ist Baby perl sollte wirklich eine while-Schleife verwenden – edehont

+1

Ihr Code, um den Inhalt von '@ flow' zu drucken, ist unnötigerweise ausführlich und kann durch die einzige Anweisung ersetzt werden:' print '$ _ \ n "für @flow;' oder (in Perl 5.10 +) 'sagen $ _ für @flow;' –

+1

@DaveCross Oder einfach 'sagen für @ flow' –

Antwort

9

Es ist einfacher als Sie denken:

my @list_of_files = glob ("/path/to/files/*"); 

Wenn Sie filtern möchten ein Kriterium - wie 'ist es ein Verzeichnis' können Sie:

my @list_of_dirs = grep { -d } glob "/path/to/dirs/*"; 
+1

Ich denke, das OP benötigt Verzeichnisse. – zdim

+0

Hallo, danke für den Zeiger, aber es sieht so aus, als listet das auch die Dateien im aktuellen Verzeichnis auf, nicht nur die Verzeichnisse. Ich habe meine Frage so modifiziert, dass sie mein Testskript enthält, weil es in den Kommentaren kompliziert erscheint. – DeltaIV

+0

'Grep' ist dann das Werkzeug für diesen Job. Beispiel aktualisiert – Sobrique

2

Öffnen Sie das Verzeichnis, in dem die Sub-Direc tories sind mit opendir, lesen Sie den Inhalt mit readdir. Filtert alles, was kein Verzeichnis mit Datei-Test -d finden -X

my $rootdir = 'top-level-directory'; 
opendir my $dh, "$rootdir" or die "Can't open directory $rootdir: $!"; 
my @dirlist = grep { -d } map { "$rootdir/$_" } readdir ($dh); 

Da readdir kehren bloße Namen müssen wir den Pfad vorangestellt wird.

+0

Mit 'glob()' ist es einfacher :-) –

+0

@DaveCross Nun ja, ich stimme natürlich zu. Aber ich dachte, dass es allen Grund geben würde, auch die andere Standardmethode zu zeigen. – zdim

0

Sie können auch dir wie diese:

my @dir = `find . -type d`; 

perl -e ' use strict; use warnings; use Data::Dumper; my @dir = `find . -type d`; print Dumper(\@dir);' 

$VAR1 = [ 
      '. 
', 
      './.fonts 
', 
      './.mozilla 
', 
      './bin 
', 
      './.ssh 
', 
      './scripts 
' 
     ];