Thomas Lachmann: große Files öffnen?

Ich möchte eine datei einlesen, und sie verändern.
Das ganze mach' ich zeilenweise...
In jeder Zeile nehme ich eine Reihe von Ersetzungen vor.
Meine Datei ist mehrere Mb (5, oder so) groß.
Das ergebnis dieser ersetzungen schreibe ich in eine neue Datei. ER schreibt allerdings nur bis zu einem gewissen Punkt und nicht weiter. Die Datei ist am Ende 10,1Kb groß

#!/usr/bin/perl

open(NEWDAT, ">newdat.txt");
print NEWDAT "Neue Datei\n";
close (NEWMAIL);

open(OLDDAT, "<olddat.txt");
while(<MAILDAT>)
{
  $_ =~  s/\HALLO\b/HALLIHALLO/g;
  open(NEWDAT, ">>newdat.txt");
  print NEWDAT $_;
  close(NEWDAT);
#  $Zeilen = $.;
}
close(OLDDAT);

tnx im voraus Thomas

PS: Vielen Dank Jörk, hat mir sehr geholfen.

  1. Ich möchte eine datei einlesen, und sie verändern.
    Das ganze mach' ich zeilenweise...
    In jeder Zeile nehme ich eine Reihe von Ersetzungen vor.
    Meine Datei ist mehrere Mb (5, oder so) groß.
    Das ergebnis dieser ersetzungen schreibe ich in eine neue Datei. ER schreibt allerdings nur bis zu einem gewissen Punkt und nicht weiter. Die Datei ist am Ende 10,1Kb groß

    #!/usr/bin/perl

    Hallo Thomas!

    Du hast die Dateihandles etwas durcheinander gehauen. Do oeffnest eine NEWDAT und schreibst in sie, schliesst aber eine NEWMAIL. Du oeffnest eine OLDDAT, liesst aber aus einer MAILDAT. Oder ist Dir das nur jetzt eben passiert, als Du dieses Beispiel geschrieben hast? Ein Groessenbegrenzung sollte es prinzipiell jedenfalls nicht geben. Normalerweise ist die einzige Begrenzung Dein verfuegbarer Arbeitsspeicher (+ Swapfile natuerlich).

    Falls Du mit den folgenden drei Zeilen nur bezweckst, eine neue Datei anzulegen, so brauchst Du uebrigens nicht extra eine Zeile auszugeben, die wird auch so angelegt.

    open(NEWDAT, ">newdat.txt");
    print NEWDAT "Neue Datei\n";
    close (NEWMAIL);

    Aber selbst das ist meines Wissens nicht noetig, wenn Du weiter unten mit

    open(NEWDAT, ">>newdat.txt");

    immer wieder etwas an die Datei anhaengst. Wenn sie da noch nicht existiert, wird sie imho automatisch angelegt.

    Calocybe

  2. Hi,

    wie Calocybe schon sagt sind Dir die Handles durcheinandergeraten. Ich erlaube mir mal eine Korrektur mit gleichzeitiger Optimierung:

    open(NEWDAT, ">newdat.txt");
    print NEWDAT "Neue Datei\n";

    open(OLDDAT, "<olddat.txt");
    while(<OLDDAT>)

    »»  {

    s/\HALLO\b/HALLIHALLO/g;
      print NEWDAT $_;

    »»  }

    close(OLDDAT);
    close(NEWDAT);

    Cheatah

  3. Ups;-)

    Da is' mir beim Bsp. schreiben doch ein kleiner Fehler unterlaufen ;-))

    #!/usr/bin/perl
    open(NEWDAT, ">>newmail.txt");

    open(OLDDAT, "<maildat.txt");
    while(<OLDDAT>)
    {
      $_ =~  s/HALLO/HALLIHALLO/g;
      print NEWDAT $_;
    }
    close(OLDDAT);
    close(NEWDAT);

    So muesste es doch eigentlich funktionieren, oder??
    Aber er schreibt immer noch nur eine 10.1kb Datei;-(

    Noch eine Idee??