Dateien rekursiv einlesen

jokey2

Erfahrenes Mitglied
Hallo Gemeinde!

Ich schreibe gerade ein Perl-Skript, das mir C-Code-Dateien einlesen soll.
Ich habe also eine Funktion ParseFile, die ich mit dem Namen einer *.c-Datei aufrufe. Diese Funktion parst dann die Datei durch und wertet u.A. auch Präprozessoranweisungen aus. Wenn sie also auf eine Zeile mit '#include ...' stößt, ruft sie sich selbst wieder auf mit dem Namen der Includedatei. Wenn sie dort wieder auf eine '#include ...'-Zeile stößt, ruft sie wieder sich selbst auf mit dem Namen der Neuen Includedatei. Also ein rekursiver Aufruf der ParseFile-Funktion.

Das Problem, das ich habe ist, daß alle Dateien natürlich mit dem gleichen HANDLE geöffnet werden, und das gilt offenbar global. Wenn ich also in der gerade aktuellen Rekursionsstufe die Datei schließe und in die vorhergehende Rekursionsstufe zurückkehre, ist das HANDLE dort scheinbar auch geschlossen und ich kann nicht mehr auf die Datei zugreifen.

Die Fragen:
- Kann ich ein Dateihandle lokal definieren, so daß in jeder Rekursionsstufe ein neues HANDLE angelegt wird?
- Kann ich ein HANDLE dynamisch erzeugen und nicht nur als Konstante? (Also in der Art:
Code:
$FileHandle = "HANDLE_$nummer";
open($FileHandle, $FileName);
)
- Gibt es irgendeine andere Lösung für mein Problem?
- Gibt es noch etwas, was ich in PERL bei rekursiven Aufrufen beachten muß?

Für etwas Hilfe wäre ich sehr dankbar!
 
Das Problem ist durch sogenannte lexikales Scoping also lokale Variabeln eigentlich ganz einfach gelöst.

Wenn du anstatt eines FILEHANDLES eine entsprechende lokale Variable verwendest, sollte die Wiedereintrittsfähigkeit deiner Funktion gegeben sein (sofern der andere kram drumherum stimmt ;) )

Perl:
sub recursive {
my $filename = shift;
open(my $file, $filename) or die "ups: $!";
...
...
...
close($file);
}

So benutzt du zwar immer die selbe Variable, jedoch wird bei jedem Funktionsaufruf für die Funktion recursive ein neuer Namensraum angelegt innerhalb dem die Variabeln einzigartig sind.

Hoffe geholfen zu haben!

Gruß,
Sven
 
Danke, so funktioniert's.
Ich hatte schon vorher versucht, eine lokale Variable dafür anzulegen, bin aber daran gescheitert, daß ich gelesen hatte, ein Dateihandle sei ein eigener Datentyp. Daher habe ich es mit 'my HANDLE;' und 'my $filehandle = HANDLE;' versucht, was aber natürlich nicht geklappt hat.
 
Das man bei open() auch direkt lexikale Variablen verwenden kann, ist auch noch nicht so alt, gibts erst seit Perl 5.6.

Ist aber sehr praktisch, mehr dazu gibts unter perldoc perlopen und dort unter "Indirect-Filehandles".
 

Neue Beiträge

Zurück