schmaidt: Zeilenumbruch in Perl-GBook Skript

Beitrag lesen

Hi nochmal!

Die Befehle die Ihr mir gepostet habt, kenne ich, aber mein Problem
liegt glaube ich da, dass ich nicht genau weiss, wo sie hingehören.

if ($cur->param("message")) {      # Es existiert ein Eintrag
An dieser Stelle prüfts Du, ob jemand einen neuen Eintrag inzufügen will.
im Parameter "message" steht offensichtlich der Text.
    $cur->param("date", scalar localtime); # aktuelle Zeit
Hier wird noch die aktuelle Zeit eingefügt
    @entries = ($cur);       # Speichern des Eintrags in das Array
zur Weiterverarbeitung abgespeichert. Davor muß nun diese Änderung rein.
}

Also so (zum Verständnis schön in einzelnen Schritten):
if ($cur->param("message")) {              # Es ...
    ###neu
    $temp = $cur->param("message");        # lesen
    $temp = s/(\r\n)|(\n)/<BR>/g;          # \n gegen <BR> tauschen
    $cur->param("message", $temp);         # schreiben
    ###
    $cur->param("date", scalar localtime); # aktuelle Zeit
    @entries = ($cur);                     # Speichern ...
}

Über einen Teil sollte aber auch noch diskutiert werden:

open the file for read-write (preserving old contents)

open(CHANDLE, "+< $CHATNAME") || bail("cannot open $CHATNAME: $!");

get exclusive lock on the guestbook

($LOCK_EX == exclusive lock)

flock(CHANDLE, $LOCK_EX) || bail("cannot flock $CHATNAME: $!");

Das flock soll verhindern, das die Datei von 2 Prozessen gleichzeitig geöffnet wird (2 User posten gleichzeitig einen Eintrag). Über diesen Mechanismus wurde schon viel diskutiert...

Eigentlich funktioniert das so:
Prozess1: öffnet die Datei
Prozess1: setzt exclusive lock
Prozess1: bearbeitet Datei
Prozess1: Schließt Datei hebt damit den lock wieder auf

Jetzt mit 2 Prozessen:
Prozess1: öffnet die Datei
Prozess1: setzt exclusive lock
                                  Prozess2: öffnet die Datei
                                  Prozess2: will exclusive lock setzen,
                                            kann aber nicht, da bereits
                                            gesetzt, wird vertagt
Prozess1: bearbeitet Datei
Prozess1: Schließt Datei hebt
          damit den lock wieder auf
                                  Prozess2: wird geweckt, kann nun
                                            exclusive lock setzen
                                  Prozess2: bearbeitet Datei
                                  Prozess2: Schließt Datei hebt
                                            damit den lock wieder auf

(Vorausstzung: open und flock sind auf Deinem Server richtig implementiert - Stichwort atomare Befehle)

Damit merkt der User, der den 2. Prozess gestartet hat, nicht, dass ein Zugriffskonflikt stattfand, es dauert nur etwas länger. Bei Dir passiert aber etwas anderes: Der 2.Prozess wird mit einer Fehlermeldung beendet. Es reicht also diese Zeile:
flock(CHANDLE, $LOCK_EX);

Na dann,
Gruß Frank

P.S. Hoffentlich ist die Formatierung nach dem Absenden noch lesbar.

DANKE DANKE DANKE. So hat es dann endlich geklappt. Allerdings hattest Du einen kleinen Tipfehler drin. Es muss nämlich

$temp =~ s/(\r\n)|(\n)/<BR>/g;    statt
$temp = s/(\r\n)|(\n)/<BR>/g;    heißen!

Aber das hab selbst ich - die Laie - noch alleine hingekriegt!

Danke nochmals, schmaidt