Fokuhila: Gaestebuch

Beitrag lesen

[...]

also, wieso wird hier die gaestebuch.html mit dem Eintrag ueberschrieben, statt den Gaestebucheintrag hinter das <!--begin-->

for ($i=0;$i<=$SIZE;$i++) {
   $_=$LINES[$i];
   if (/<!--begin-->/) {

Dieser reguläre Ausdruck prüft nur, ob <!--begin--> vorhanden ist. Wenn ja, wird sofort losgeschrieben.

print OUTFILE "

hallo,

Moment, damit wir nicht aneinander vorbeireden: Mit sofort losschreiben meine ich nciht an der Stelle, an der eine Übereinstimmung mit dem Muster gefunden wurde. Die Stelle mit der Musterübereinstimmung ist Perl gar nicht bekannt! Du müsstest wenn schon den s-Operator anstatt dem m-Operator benutzen. Wenn du einen Regex aufbaust, ohne ein m vornedran zu stellen, denkt sich Perl einfach eines dazu. Du benutzt also m. Natürlich ist es mit m möglich, $_ zu ändern.

und genau das macht es eben nicht - ich kapiere einfach nicht wieso
hier:

open(OUTFILE, ">$outfile") or die "\Datei $outfile konnte nicht geoeffnet werden\n";
flock(OUTFILE, LOCK_EX) or die "\Cannot lock $outfile\n";

Lass mal kurz die Lock()-erei. Befassen wir uns mit der zu lesenden Datei und schreiben wir (bis alles klappt) auf STDOUT!

for ($i=0;$i<=$SIZE;$i++) {
   $_=$LINES[$i];
   if (/<!--begin-->/) {

Ich hab da eine Alternative im Sinn. Wie wäre es denn mit map()? Schön perlig, ne?

@zeilen = map {
  if ( m(<!--begin-->) ){
    &eintrag
    .$_;
  } else {
    $_
  }
} (<INFILE>);

print <STDOUT> @zeilen;

Du kannst später <STDOUT> durch <OUTFILE> ersetzen.

Oder so:

print <OUTFILE> map {
  if ( m(<!--begin-->) ){
    &eintrag
    .$_;
  } else {
    $_
  }
} (<INFILE>);

So viel Code auf so wenig Raum kann aber schnell in die Hose gehen. Am besten lässt du es in kleinen Portiönchen. Die passen gut in jeweils eine Subroutine.

die frage bleibt aber, wieso mit Hilfe von >$outfile die .html datei ersetzt wird obwohl die eintraege eben erst ab dem begin eingesetzt werden sollten

Nochmal: Perl hat sich die Stelle mit der Musterübereinstimmung nicht gemerkt und beachtet Sie folglich nicht, während du $_ manipulierst.

Noch ein Tipp: öffne die Datei (anders als in Selfhtml beschrieben) ohne >, >> oder < am Anfang! Einfach open( "DATEI", "./$dateiname"); Dann ist sie zugleich zum Lesen und Schreiben offen, und $_ lässt sich besser "kneten".

Gruß Fokuhila
P.S. den "Anschiss" nehm ich zurück, falls das noch geht.