Michael Schröpl: (Perl/Datenstruktur) Hash of Files - es funktioniert!

Beitrag lesen

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;