Frank Schönmann: CGI: Daten in Datei schreiben, nicht am Ende sondern am ANFANG?

Beitrag lesen

hi!

Ich geh jetzt nur mal auf die entscheidende Stelle ein. Erstmal eine kurze Erklärung, was die einzelnen Stellen machen.

open (HTMLOLD, "$file");

Die Datei in der Variable $file wird zum Lesen geöffnet. Als Dateihandler dient der Name HTMLOLD. Die Datei dürfte die alte messages.html sein

@lines=<HTMLOLD>;

@lines ist ein Array bzw. eine Liste. In diese Liste werden alle Zeilen der eben geöffneten Datei eingelesen, also eine Zeile pro Listenwert.

close(HTMLOLD);

Die Datei wird wieder geschlossen.

open (NEW, ">$file");

Die gleiche Datei wird wieder geöffnet, dieses Mal aber mit dem Dateihandler NEW und zum Schreiben (erkennbar an dem ">"-Zeichen vor $file).

print NEW "HIER ENSTEHT DER HTML-DATEI_KOPF\n";
for ($i = 2; $i < 16; $i++)
{

»»   print NEW "$lines[$i]";

}

Diese for-Schleife bewirkt, das ab dem zweiten Listenwert einfach wieder alles bis zum 15. Listenwert in die Datei geschrieben wird.$lines[$i] ist der Zugriff auf das $i-te Element der Liste @lines.
Was ich leider nicht ganz verstehe, ist, warum nur die ersten 15 Elemente der Liste wieder in die Datei geschrieben werden. Eigentlich sollten eher die letzten 15 Elemente reingeschrieben werden, oder seh ich da jetzt was falsch?

print NEW "<b>$formdata{'username'}</B>";

In eine neue Zeile wird der Benutzername des Absenders geschrieben.

if ($formdata{'message'} eq "Betritt den Chat")
{

»»   print NEW ": ";
»»   print NEW "<i>Betritt den Chat</i>";

}

Wenn jemand den Chat betritt, wird das geschrieben.

else
{

»»   print NEW ": ";
»»   print NEW ""$formdata{'message'}"";

}

Ansonsten wird die abgesendete Nachricht geschrieben.

print NEW "\n<p>\n";
close(NEW);

Abschließend wird die Datei wieder geschlossen.

Da das ganze oben ziemlich umständlich realisiert wurde, musst du einfach die Ausgaben in die Datei ein wenig vertauschen. Statt wie oben erst die Liste neu zu schreiben und dann die neue Nachricht, schreibst du erst die neue Nachricht und dann die Liste:

print NEW "HIER ENSTEHT DER HTML-DATEI_KOPF\n";
print NEW "<b>$formdata{'username'}</B>";

if ($formdata{'message'} eq "Betritt den Chat")
{
  print NEW ": ";
  print NEW "<i>Betritt den Chat</i>";
}
else
{
  print NEW ": ";
  print NEW ""$formdata{'message'}"";
}
print NEW "\n<p>\n";

for ($i = 2; $i < 16; $i++)
{
     print NEW "$lines[$i]";
}

Das sollte eigentlich schon alles sein, falls ich nichts übersehen habe. Im übrigen muss ich sagen, dass einige Stellen wirklich etwas komisch, umständlich oder unnötig sind. Das Skript dient also nicht gerade als Musterbeispiel für Perl-Programmierung ;-))

bye, Frank!