Readdir ohne '.' und '..' Auflistung

Hallo zusammen,

ich arbeite mit Perl unter Windows und bin noch in der Lernphase - also seid nicht zu hart zu mir :smile:
Mal angenommen, ich will mir alle Files aus einem Verzeichnis ausgeben lassen:

opendir(in,'C:/abc\_verzeichnis/');
@a=readdir(in);
close in;

foreach (@a) {
 print $\_ ."\n";
}

Dann hab ich das Problem, dass er mir aus „in“ immer auch die Punkte ausliest:

.
..
bla.txt

Nun meine Frage, die ich mir durch googlen nicht beantworten konnte. Gibt es fĂŒr readdir einen Parameter, der mir diese Punkte nicht ausliest? Wenn nicht, muss ich eben die Ausgabe bearbeiten, aber wĂ€r eben umstĂ€ndlicher :wink:

Danke und Viele GrĂŒĂŸe
Tom

Hallo

ich arbeite mit Perl unter Windows und bin noch in der
Lernphase - also seid nicht zu hart zu mir :smile:

Schon ok :wink:

Mal angenommen, ich will mir alle Files aus einem Verzeichnis
ausgeben lassen:

opendir(in,‚C:/abc_verzeichnis/‘);
@a=readdir(in);
close in;
foreach (@a) {
print $_ ."\n";
}

Dann hab ich das Problem, dass er mir aus „in“ immer auch die
Punkte ausliest:

Richtig.

Nun meine Frage, die ich mir durch googlen nicht beantworten
konnte. Gibt es fĂŒr readdir einen Parameter, der mir diese
Punkte nicht ausliest? Wenn nicht, muss ich eben die Ausgabe
bearbeiten, aber wÀr eben umstÀndlicher :wink:

Readdir liest ĂŒber das Betriebssystem immer alle
EintrÀge aus dem Verzeichnis aus. Man kann die
Ausgabe von readdir aber „filtern“, sprich -
nur die EintrÀge in sein eigenes Array nehmen,
die man möchte.

FĂŒr Perl wĂ€re das der 'grep-Operator:

my @fnames = grep ! /^\.{1,2}$/, readdir $dh;





grep ==\> http://perldoc.perl.org/functions/grep.html
 ! ==\> lasse Eintrag durch, wenn Bedingung nciht zutrifft
/^\.{1,2}$/ ==\> regulÀrer Ausdruck, ^ (Stringanfang), \. Punkt
 als Zeichen '.', mindestens 1 mal, maximal 2 mal,
 also '.' und '..', $ = Stringende

Dein Programm sÀhe dann etwa so aus:

use strict;
use warnings;

my $dirname = 'C:/abc\_verzeichnis/';
opendir my $dh, $dirname or die "$dirname geht nicht, $!";
my @fnames = grep ! /^\.{1,2}$/, readdir $dh;
close $dh;

print join "\n", @fnames;

Du kannst Dir auch mal http://perldoc.perl.org/File/Glob.html
und http://perldoc.perl.org/functions/glob.html
ansehen.

GrĂŒĂŸe

CMb

Huhu!

Danke dir.
Mit „grep“ habe ich es inzwischen selbst realisiert :smile:
Ich hab mich nur gefragt, ob fĂŒr readdir auch Parameter vorhanden sind, welche ich nur nicht gefunden habe.

Allerdings ist nun auch rausgekommen, dass mir das ganze gar nix bringt.

Zu deinem Tipp: Ich hatte davor tatsĂ€chlich schon einen „glob“, welcher hilfreicher war. Ich wollte mit „readdir“ nur einen Schönheitsfehler beseitigen.

my @zipfiles=glob('C:/abc/def/\*.log C:/abc/def/\*.xls');

Ich benötige die Ausgabe fĂŒr das darauffolgende Zippen.

my $zipname = "C:/abc/def/test.zip";
my $zip = Archive::Zip-\>new();

foreach my $membername (@zipfiles)
{
 $zip-\>addFile( $membername )
}

my $status = $zip-\>writeToFileNamed($zipname);

In dem test.zip muss ich allerdings nochmal die ganze Baumstruktur durchklicken, bis ich zu meinen *.log und *.xls Daten komme - also abc/def/. Ich hoffe, dass hab ich jetzt verstĂ€ndlich ausgedrĂŒckt :wink:

Wenn ich nun den ZIP-Abschnitt mit dem Array durchlaufe, welches ich von „readdir“ und „grep“ bekomme, bekomme ich einen Fehler beim AusfĂŒhren - ich denk, das liegt daran, dass dann in $zipfiles kein Bezug mehr zum Pfad vorhanden ist.

Das war eigentlich der ganze Hintergrund - nur ein kleiner Schönheitsfehler, den ich beseitigen wollte :wink:

Viele GrĂŒĂŸe

1 Like