Frage

    

Diese Frage bereits eine Antwort hier:

         

Ich mag ls in einem Perl-Programm als Teil eines CGI-Skript auszuführen. Dazu verwendete ich exec(ls), aber nicht zurück aus dem exec Aufruf.

Gibt es eine bessere Art und Weise eine Auflistung eines Verzeichnisses in Perl zu bekommen?

War es hilfreich?

Lösung

Exec gar nicht zurück. Wenn Sie, dass die Verwendung System wollen.

Wenn Sie nur ein Verzeichnis lesen möchten, öffnen / lesen / close-dir besser geeignet sein.

opendir my($dh), $dirname or die "Couldn't open dir '$dirname': $!";
my @files = readdir $dh;
closedir $dh;
#print files...

Andere Tipps

Alle anderen auf dem exec Teil der Frage stecken scheint.

Wenn Sie eine Verzeichnisliste möchten, verwenden Sie Perl eingebauten in glob oder opendir. Sie brauchen keinen separaten Prozess benötigen.

exec gibt nicht die Kontrolle zurück zu dem Perl-Programm. System , aber es gibt nicht die Ergebnisse eines ls, es gibt einen Statuscode. Skalenmarkierungen `` geben Sie die Ausgabe unseres Befehl, sondern wird von einigen als unsicher betrachtet.

Verwenden Sie die in dir Funktionen eingebaut. opendir, readdir, und so weiter.

http://perldoc.perl.org/functions/opendir.html

http://perldoc.perl.org/functions/readdir.html

Um die Ausgabe eines Systembefehl bekommen Sie müssen Backticks verwenden.

$listing = `ls`;

Allerdings Perl ist gut mit Verzeichnissen für sich selbst im Umgang. Ich würde empfehlen, mit Datei :: Find :: Regel.

Verwenden Perl Globbing:

my $dir = </dir/path/*> 

Ein weiteres Beispiel:

chdir $dir or die "Cannot chroot to $dir: $!\n";
my @files = glob("*.txt");

EDIT: Whoops! Vielleicht haben Sie nur eine Auflistung der Verzeichnisse wollte ... entfernen Sie das ‚Verzeichnis‘ nennen dieses Skript zu tun, was Sie wollen es ...

mit Dateihandies Spielen ist der falsche Weg, meiner Meinung nach gehen. Das Folgende ist ein Beispiel für Datei mit :: Find :: Regel, um alle Verzeichnisse in einem bestimmten Verzeichnis zu finden. Es mag wie über töten scheinen für das, was Sie tun, aber später auf der ganzen Linie kann es sein, lohnt sich.

Zuerst meine eine Zeile Lösung:

File::Find::Rule->maxdepth(1)->directory->in($base_dir);

Nun wird eine mehr herausgezogen Version mit Kommentaren. Wenn Sie Datei haben :: Find :: Regel installiert sollten Sie in der Lage sein, diese kein Problem zu laufen. Sie nicht die CPAN fürchten.

#!/usr/bin/perl

use strict;
use warnings;

# See http://search.cpan.org/~rclamp/File-Find-Rule-0.32/README
use File::Find::Rule;

# If a base directory was not past to the script, assume current working director
my $base_dir = shift // '.';
my $find_rule = File::Find::Rule->new;

# Do not descend past the first level
$find_rule->maxdepth(1);

# Only return directories
$find_rule->directory;

# Apply the rule and retrieve the subdirectories
my @sub_dirs = $find_rule->in($base_dir);

# Print out the name of each directory on its own line
print join("\n", @sub_dirs);

Ich würde Ihnen empfehlen, einen Blick auf IPC :: Open3 . Es ermöglicht weit mehr Kontrolle über den erzeugten Prozess als System oder die Backticks tun.

Unter Linux, ziehe ich es finden:

my @files = map { chomp; $_ } `find`;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top