Mit einer kleinen Funktion kannst du dir aus lokalen Filehandles Variablen erzeugen:
sub return_fh
{
my $filename = shift;
local *FH; # local, nicht my!
open FH, "<$filename" or return undef;
return *FH;
}
$handle = &return_fh("datei.txt");Die so erzeugten Skalare solltest du dann auch problemlos in Hashes oder Arrays speichern können.
Yup, es läuft! Vielen Dank, Frank!!!
(Mit den aktuellen Testdaten von heute werden übrigens *355* Dateien parallel erzeugt - gut, daß ich nicht ernsthaft darüber nachgedacht habe, die Datei einmal pro Datum zu verarbeiten ... mit der vorliegenden Lösung geht die zusätzliche Ausgabe gegenüber dem Einlesen der Datei und dem Zerlegen per regexps nahezu in Nullzeit ...)
Mein Modul dazu: (cut&paste ...)
package zerleger_store;
Globale Variablen
Verzeichnis für Ausgabedateien
$zerleger_store::outdir_name = "";
(wird von außen gesetzt)
Tabelle von Filehandles aller offenen Ausgabedateien
my %filehandles = ();
Funktion: Dynamisch eine neue Ausgabedatei öffnen
sub new_file ($)
{
# Parameter zuweisen
my ($filename) = @_;
# Ein lokales typeglob eines filehandles (?)
local *HANDLE;
# Eine neue Datei zum Schreiben öffnen
if (open (HANDLE, ">$filename"))
{
# Filehandle als Ergebnis zurückliefern
return *HANDLE;
}
else
{
# Fehlermeldung und Abbruch
abort ("new_file / $filename: open[write] gescheitert");
}
}
Funktion: Einen Wert in die passende Tagesdatei abspeichern
sub value ($$)
{
# Parameter zuweisen
my ($datum, $wert) = @_;
# Ist die passende Ausgabedatei bereits geöffnet?
if (! defined ($filehandles {$datum}))
{
# Nein, wir müssen also eine neue öffnen ...
$filehandles {$datum} = new_file ("$zerleger_store::outdir_name\$datum.dat");
}
# *Jetzt* haben wir die Datei,
# oder das Programm ist in new_file abgebrochen worden ...
# Nun können wir den Wert in die Datei ausgeben
my $file = $filehandles {$datum};
print $file $wert;
}
Modul-Initialisierung
Initialisierung erfolgreich abgeschlossen
1;