Aquariophile: \n verloren :-(

Hallo !!

Danke, dass Du Dich meines Problems annimmst.

Es geht um folgendes:
Mein Script ließt eine 3-zeilige Datafile aus.
Jede Zeile enthält die Zahl 3.

Das schaut dann also so aus:

3
3
3

Nun kommt das Script her,
printet die 3 zeilen,
dann erhöht es den Wert der 2. Zeile um 1 und schreibt die Datafile neu.

Dabei sollte _kein_ zeilenumbruch verloren gehen.

in der Praxis schaut es aber so aus,
dass nach dem 2. reload plötzlich _keine_ 3 Zeilen,
sondern nur mehr 2 oder gar nur mehr 1 Zeile da ist.

Um das zu verhindern habe ich an die zu schreibende Zeile schon versucht ein \n ranzumachen,
aber dann kommen doppelte Zeilenabstände....

Bitte helfen.
Danke

-----------------------------------------------------

#!/usr/bin/perl

"Content-type: text/html\n\n";

use strict;
use CGI;

open (DATA, "<data.dat") || die "error";
my @data = <DATA>;
close(DATA);

print "Vor dem schreiben der Datafile<br><br>\n\n";
print $data[0]."<br>\n";
print $data[1]."<br>\n";
print $data[2]."<br>\n";

open (DATA, ">data.dat")  || die "error";
$data[1]++;
print DATA @data;
close(DATA);

print "<br>NACH dem schreiben der Datafile<br><br>\n\n";
print $data[0]."<br>\n";
print $data[1]."<br>\n";
print $data[2]."<br>\n";

-----------------------------------------------------

Anmerkung:
So schaut es LEIDER aus:

Ohne irgendwas:
3
3
3

Erster- Reload
3
4
3

zweiter reload

3
44

Also die Dritte Zeile geht verloren und die unteren beiden zeilen schiben sich ohne \n zusammen :-/

----------------------

So SOLLT Es aussehen:

3
3
3

-----------

3
4
3
--------------

3
5
3
-------------
3
6
3
--------------

Danke,
Aqua

  1. Hallo,

    #!/usr/bin/perl
    "Content-type: text/html\n\n";

    Da sag ich jetzt nichts;-)

    my @data = <DATA>;

    weißt Du eigentlich, was jetzt in $data[1] drinsteht?
    Richtig, "3\n". Also nicht nur die Zahl, sondern auch der Zeilenumbruch.

    [...]
    $data[1]++;

    Und jetzt soll zu dem Zeuchs von oben was addiert werden. Perl versuch das Beste, findet auch eine Zahl, wandelt intern den String in eine Zahl um, Addiert und schreibt das ganze zurück in die Variable.
    Was bei der Aktion auf der Strecke bleibt, ist der Zeilenumbruch.

    print DATA @data;

    Deshalb wird hier beid $data[1] auch kein Zeilenumbruch ausgegeben.

    Jetzt kannst Du natürlich versucht sein,
    $data[1]++;
    $data[1].= "\n";
    zu schreiben. Aber das wäre nicht so toll, obwohl es das aktuelle Problem lösen würde.

    Du solltest IMHO von Anfang an klare Verhältnisse schaffen.
    D.h. schon beim Einlesen die Zeilenumbrüche entfernen.
    Dann mit den Werten arbeiten.
    Beim Rausschreiben hängst Du eben bei jeder Zeile einen Zeilenumbruch an.

    Grüße
      Klaus