Thread Verzeichnis durchsuchen - C# viel schneller als Perl? (15 answers)
Opened by Gustl at 2013-07-04 16:41

Linuxer
 2013-07-04 18:22
#168722 #168722
User since
2006-01-27
3891 Artikel
HausmeisterIn

user image
Code: (dl )
1
2
3
    opendir (DIR, $path) or die "Unable to open $path: $!\n";
my @files = grep { !/^\.\.?$/ && !-d $_ } readdir (DIR);
closedir (DIR);


Wenn das Skript selber nicht gerade im $path steht, dann schlägt -d $_ aber fehl, es sei denn, im aktuellen Verzeichnis ist ein Eintrag vorhanden, der genauso lautet, wie der in $_ vorliegende.
Ansonsten macht das !-d $_ hier wenig Sinn. Wenn Du erfolgreich Verzeichnisse aus @files heraushälst, kannst das Skript nicht in diesen Verzeichnissen weitersuchen. Ausserdem hast Du in der foreach-Schleife ebenfalls einen Test auf Verzeichnis. Warum zwei mal? Das kostet Zeit...

Dieses und das map (kostet auch Zeit...) könntest Du IMHO vermeiden, wenn Du in process_files direkt nach dem Übernehmen nach $path ein chdir machen würdest.

Und das print für jede Datei würde ich auch rauswerfen und erst am Schluss machen mit gefülltem Ergebnis-Array machen.

Du suchst nach Dateien mit der Endung .pdw? Dann veranker doch Deinen Regex am Stringende. Jetzt sucht er im gesamten Pfad/Dateinamen nach einer Zeichenfolge .pdw (inklusive einem vorangestellten .*, das auch wieder kostet); das kostet Zeit, überall zu suchen...

Ungetestet, quick-hacked:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
use Cwd;

sub process_files {
my $path = shift;
my $dir = getcwd;
chdir( $path ) or die "chdir($path) failed: $!";

opendir (my $dh, ".") or die "Unable to open ".": $!\n";
my @files = grep { !/^\.\.?$/ } readdir ($dh);
closedir ($dh);

foreach(@files){
if ( -d $_ ) {
process_files($_);
}
elsif ( $_ =~ /\.pdw$/ ) {
push @files_erg, $_;
}
}
chdir ( $dir ) or die "chdir($dir) failed: $!\n";
}


edit: Habe noch mal drüber nachgedacht. Dem chdir($path) geschuldet, muss das opendir auf "." losgelassen werden...
edit2: Cwd::getcwd nachgetragen...
Last edited: 2013-07-04 22:36:06 +0200 (CEST)
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!

View full thread Verzeichnis durchsuchen - C# viel schneller als Perl?