if(-d $datei) funktioniert nicht
am 11.02.2007 13:48:43 von artur.shokin
Hallo, Leute!
Ich bin neu in Perl. Und hab ein kleines Problem. In meinem Script
suche ich alle Folders in im von mir angegebenen Pfad. So ist der
Theory. Es laeuft aber nicht so.
#!/usr/local/bin/perl -w
use strict;
opendir(DIR,"c:\\windows");
while(my $datei = readdir(DIR))
{
if(-d $datei)
{
print ($datei."ist eine Directory\n" );
}
}
closedir(DIR);
die Ausgabe dieses Scriptes ist:
..ist eine Directory
...ist eine Directory
Ich benutze ActivePerl 5.8.8 unter WindowsXP
Hilfe!!
Mfg
Artur
Re: if(-d $datei) funktioniert nicht
am 11.02.2007 14:03:25 von Christian Winter
artur.shokin@googlemail.com schrieb:
>
> #!/usr/local/bin/perl -w
> use strict;
> opendir(DIR,"c:\\windows");
> while(my $datei = readdir(DIR))
> {
> if(-d $datei)
> {
> print ($datei."ist eine Directory\n" );
> }
> }
> closedir(DIR);
>
> die Ausgabe dieses Scriptes ist:
>
> .ist eine Directory
> ..ist eine Directory
Der "-d" Operator arbeitet immer im aktuellen Verzeichnis (und
die einzigen Einträge, die sowohl unter "C:\Windows" als auch
in allen anderen vorhanden sind, sind "." und "..").
Die logische Abhilfe:
entweder
chdir "C:\\windows"
vor der while-Schleife einfügen, oder "-d" den kompletten Pfad
mit
if( -d "C:\\windows\\$datei" )
übergeben.
Das ist aber in "perldoc -f readdir" sogar erklärt:
[schnipp]
If you're planning to filetest the return values out of a
"readdir", you'd better prepend the directory in question.
Otherwise, because we didn't "chdir" there, it would have been
testing the wrong file.
[schnapp]
-Christian
Re: if(-d $datei) funktioniert nicht
am 11.02.2007 14:05:52 von Wolf Behrenhoff
artur.shokin@googlemail.com schrieb:
> Hallo, Leute!
>
> Ich bin neu in Perl. Und hab ein kleines Problem. In meinem Script
> suche ich alle Folders in im von mir angegebenen Pfad. So ist der
> Theory. Es laeuft aber nicht so.
>
> #!/usr/local/bin/perl -w
> use strict;
> opendir(DIR,"c:\\windows");
> while(my $datei = readdir(DIR))
> {
> if(-d $datei)
> {
> print ($datei."ist eine Directory\n" );
> }
> }
> closedir(DIR);
readdir liefert dir den Namen der Dateien im Ordner Windows, nicht den
vollständigen Pfad zu diesen! Dein Script läuft also nur dann richtig,
wenn es in c:\windows als Arbeitsverzeichnis ausgeführt wird.
Du musst den -d-Test anders machen:
if (-d "C:\\Windows\\$datei") { ... }
Oder du kannst grep nutzen:
use strict;
use warnings;
opendir(DIR,"c:/windows");
my @dirs = grep { -d "c:/windows/$_" } readdir DIR;
closedir(DIR);
print "$_ ist ein Directory\n" for @dirs;
Und du kannst, wie hier dargestellt, auch unter Windows "/" zum Trennen
von Ordnern nehmen, dann entfällt das lästige Verdoppeln des Backslashes.
Wolf