Kai Diefenbach: Fehler in Prozedur oder Hile ich bin blind

Beitrag lesen

Hallo Lars,

hi,

folgendes prob: ich schreibe mit einem script html-code in eine bestehene html-seite, nun moechte ich aber (wenn sich der html-code aendert) diesen auch wieder aus dieser datei rauskriegen.
mein ansatz: ich schreibe in die html-datei <!--SCRIPTSTART--> mein html-code <!--SCRIPTENDE-->.
nun moechte ich den text zwischen diesen beiden zeilen "killen" und statt der beiden <!-- --> nur <!--SCRIPTSTART--> da stehen haben, als anfangsmarke fuer das reinschreibscript. (die rechtschreibung ist ok!)

hier meine sub dafuer, wenn ich sie ausfuehre, loescht er mir ja auch den alten eintrag er schreibt auch <!--SCRIPTSTART--> hin, aber dann nicht den Rest der html-datei. d.h. <!--SCRIPTSTART--> steht dann am ende der html-datei und nicht wie gewollt mitten in der datei.

koennte sich jemand bitte dieses problems antun?

antun ist, glaube ich, der richtige Ausdruck ; )

#!perl

Du solltest *immer*

use strict;

und dann natuerlich my verwenden (lass ich *hier* der Einfachheithalber weg)

sub check4old_script{
$errormsg="Fehler beim Laden der Datei: $meine_html (";
open (DATEI $meine_html) &error($errormsg.$!.')');

hier fehlt ein ','.
open DATEI, $meine_html or die "open DATEI: $!";

@lines=<DATEI>;
close (DATEI);
$filesize=@lines;

kannst Du weglassen und $#lines benutzen

$errormsg="Fehler beim Durchchecken nach altem Code in der Datei: $meine_html (";
open (DATEI>$meine_html) &error($errormsg.$!.')');

open DATEI, ">$meine_html" or die "open DATEI: $!";

for ($f=0;$f<=$filesize;$f++) {

for ($f=0; $f=$#lines;$f++) {
oder gar
for (0.. $#lines) {

$_=$lines[$f];
  if (/<!--SCRIPTSTART-->/) {
    while ($_ ne /<!--SCRIPTENDE-->/) {

Du meinst (wahrscheinlich)
while ($_ ne '<!--SCRIPTENDE-->') {

$_=$lines[$f];
     $f++;
    }
   print DATEI '<!--SCRIPTSTART-->';
  }

»»  else {print DATEI $_;}
»»  $f++;

Hier erhoehst Du den Index ein zweitesmal, d.h. Du ueberspringst jedesmal eine Zeile.

}
close (DATEI);
}

Kann sein, dass ich noch etwas uebersehen habe, den Code solltest Du aber auf jeden Fall noch mal ueberdenken.

Ich wuerde es so machen:

#!perl -w

use strict;

my $meine_html = 'test.html';
my $neue_html  = 'test_neu.html';

open DAT, $meine_html or die "open $meine_html: $!";
open NEU, ">$neue_html" or die "open $neue_html: $!";

while (<DAT>) {
print NEU;
last if /<!--SCRIPTSTART-->/;
}

while (<DAT>) { last if /<!--SCRIPTENDE-->/ }

while (<DAT>) { print NEU};

close DAT;
close NEU;

rename ($neue_html, $meine_html); # bei Bedarf

vielen dank schon mal soweit

bye lars

Gruss
   Kai