Thread rekursion klappt nicht (9 answers)
Opened by supersucker at 2006-02-09 21:07

murphy
 2006-02-10 18:29
#62820 #62820
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
[quote=supersucker,10.02.2006, 14:47]@murphy:
[...]
da krieg ich nun eine merkwürdige (zumindest für mich) fehlermeldung:

Quote
./rectFileNames.pl
start renaming files....
scandir() aufgerufen!
readline() on unopened filehandle CURDIR at ./rectFileNames.pl line 40.
       (Are you trying to call readline() on dirhandle CURDIR?)
finished renaming files....


hmm,

damit kann ich überhaupt nichts anfangen, erstens verwende ich readline ja nicht und zweitens öffne ich doch das filehandle.

deinen zweiten vorschlag:

Code: (dl )
opendir(my $curdir, '.') or die "could not open directory: $!\n";


konnte ich nicht verwenden, da ich nicht weiss wie ich darüber iteriere (mit anderen worten, was ich dann in die bedingung der while-schleife schreiben),  $curdir wäre doch dann ein skalar, oder?[/quote]
Zu der Fehlermeldung: Du verwendest durchaus readline, denn der Ausdruck
Code: (dl )
<CURDIR>
ist nur eine praktische Abkürzung für den Ausdruck
Code: (dl )
readline(*CURDIR)
. Genau da liegt auch das Problem, denn ein Verzeichnishandle kann nicht mit readline ausgelesen werden. Du musst stattdessen, wie es vayu in seinem Beispiel schreibt, readdir verwenden, also einfach
Code: (dl )
<CURDIR>
durch
Code: (dl )
readdir(*CURDIR)
ersetzen. Den '*' als Typindikator für einen Typeglob kannst du natürlich auch weglassen.

Verwendest du zum Öffnen des Verzeichnisses die "modernere" Syntax
Code: (dl )
opendir(my $curdir, '.')
, so enthält die lexikalische Skalarvariable $curdir danach eine Referenz auf einen anonymen Typeglob. Das siehst du auch, wenn du zum Beispiel mal
Code: (dl )
perl -le 'opendir my $d, "."; print ref $d'
ausführst. Eigentlich ist es aber auch gar nicht so wichtig, was in der Variable hinterher drinsteckt. Viel wichtiger ist, dass man die Variable hinterher genauso wie ein Dateihandle verwenden kann, also einfach
Code: (dl )
readdir($curdir)
und ähnliches schreiben kann.

Mir ist schließlich noch eine Kleinigkeit aufgefallen: Da du mittels chdir in Unterverzeichnisse wechselst, solltest Du irgendwo auch mittels
Code: (dl )
chdir('..')
wieder zurückwechseln ;)
When C++ is your hammer, every problem looks like your thumb.

View full thread rekursion klappt nicht