Matti Maekitalo: cgi/perl gästebuch

Beitrag lesen

use Mosche;

require "cgi-lib.pl";

Benutze lieber CGI.pm. Suche dazu im Archiv, da wurde dies bereits mehrfach erklärt.

$date = &ctime(time);

Lass das '&' weg, es ist veraltet (du brauchst es nur noch, wenn du Referenzen auf Subroutinen benutzen willst).

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

Benutze here-Dokumente:

print <<"ENDE";
Content-type: text/html

<Doctype ...>

dein HTML-Quellcode

END

$outfile = ">> gaestebuch.html";
open(OUTFILE, $outfile);

Ist die Datei erfolgreich geöffnet worden? Fange Fehler mit

open FH, $outfile or die "Fehler: $!";

ab.

print OUTFILE "

Auch hier kannst du here-documents einsetzen (diese sind m.E. schöner als mehrzeilige Strings, obwohl sie letztendlich gleich geparst werden. Du musst dich aber nicht mehr um Maskierung von Sonderzeichen kümmern (, ", ', ...);

<hr>
Am $date kritzelte <b>$in{'username'}</b> (eMail: <a href=mailto:$in{'email'}>$in{'email'}</a>)

Mit CGI.pm statt %in kommt jetzt param('dein_key');

<li>$in{'check1'}

Neuere HTML-Versionen (bzw. XHTML) machen es erforderlich, dass du deine Tags richtig schliesst:

<li>text</li>

so meine frage dazu ist wie das, was in die datei gaestebuch.html geschrieben wird, nicht als letztes in die html datei eingefügt wird sondern zum beispiel in die mitte, sodass ich am schluss noch einen  fixen text haben kann oder sonstiges

Dann musst du die Datei erst einlesen (in einen Array), schliesst den Lesezugriff und öffnest sie zum Schreiben. Dann durchläufst du diesen Array (und druckst immer alle Zeilen in die Datei aus), bis du zu einer bestimmten Markierungszeile kommst (einen HTML-Kommentar zB). Dort schreibst du dann deinen neuen Eintrag, und dann weiter mit dem Array. Ungetestetes Beispiel:

my $file = 'blah.html';

open(FH, "<$file") or die "Kann '$file' nicht zum Lesen oeffnen: $!";
my @guestbook = <FH>; # die gesamte Datei ist jetzt im Array
close(FH);

open(FH, ">$file") or die "Kann '$file' nicht zum Schreiben oeffnen: $!";
foreach (@guestbook) {
   # erst mal aktuelle Zeile rein schreiben (damit nichts verloren geht)
   print FH $_;

# wenn die Markierungszeile erreicht ist,
   # deinen Text _darunter_ setzen (weil die aktuelle Zeile bereits
   # neu geschrieben ist (ansonsten Reihenfolge umdrehen)
   if (/<!--Jetzt neuen Beitrag-->/){
   print <<"ENDE";
   Das ist ein neuer Kommentar in meinem Gästebuch. Er steht ganz oben, weil mein Einfügungskommentar auch vor den anderen Beiträgen stand (und weiterhin steht).

ENDE
   }
}
close(FH;

Ganz einfach, oder? Wenn du das verfeinern willst (und performance-mäßig verbessern), nimm zB eine temporäre Datei, in die du gleich reinschreibst (und sparst dir den Array), und kopierst dies um. Dieses hier müsste performance-mäßig für die meisten Guestbooks vollkommen ausreichen :-)

use Tschoe qw(Matti);

--
$a=n(1001010);print chr($a+=$_)for(0,43,-2,1,-84,65,13,1,5,
-12,-3,13,-82,48,21,13,-6,-76,72,-7,2,8,-6,13,-104);sub n{
$b=0;$_=0;for($c=length$_[0];$c;--$c){$_+=_($b)if substr$_
[0],$c-1,1;$b++;}$_}sub _{($d)=@_;for($e=1;$d--;$e*=2){}$e}