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 „Gefällt mir“