Kay Lerch: Datei wird falsch editiert

Ich möchte eine Textstelle in einer HTML-Datei editieren.

Auszug aus der HTML-Datei :

<!-- Ticker:Anfang -->
  <input type="hidden" name="message" value="
  Ich bin ein Ticker
  ">
  <!-- Ticker:Ende -->

Auszug aus der Perl-Datei

@alldats=<*.html>;   # Erfassen aller HTML-Dateien im Ordner
 foreach(@alldats)
 {
  if (-f $_)          # prüft Existenz
  {
   open(HTML,"<$_")   # Öffnen zum Lesen
   @datinh=<HTML>;
   foreach(@datinh)
   {
    $p++;
    if(/<!-- Ticker:Anfang -->/) # Wenn Kommentar-Position gefunden ..
    {
     $tickerid=$p; # Merken der Position
    }
   $p++;
   }
   close(HTML);

$datinh[$tickerid+2]=$form{'tickertext'}; # Ersetzen der übernächsten Zeile (siehe HTML-Datei)

open(HTML,">$_")  # Neues Schreiben der Datei
   foreach(@datinh)
   {
     print HTML $_;
   }
   close(HTML);
  }

Keine Fehlermeldung. Jedoch wird der Text nicht ersetzt, sondern ist am Dateiende wiederzufinden. Ich habe viel probiert und nichts ging.

Wer kann helfen.

  1. Aus versehen wird $p zweimal in der Schleife inkrementiert. Ist nur eine Fehler im Beitrag. Im Script ist das nicht der Fall.

  2. Hi,

    Ich möchte eine Textstelle in einer HTML-Datei editieren.
    [...]

    Keine Fehlermeldung. Jedoch wird der Text nicht ersetzt, sondern ist am Dateiende wiederzufinden. Ich habe viel probiert und nichts ging.

    Wird $p am Anfang mit $p=0 initialisiert? Lass dir doch mal $tickerid ausgeben, ob die Position stimmt.

    Oder schau dir mal das Modul HTML::Parser an. Mit dem sollte sowas einfacher gehen.

    HTH

    Margin-Auto

    1. Ja, $p wird initialisiert. Die ausgegebene Tickerid hat seltsamerweise keinen Wert.

  3. Hallo Kay.

    Ich möchte eine Textstelle in einer HTML-Datei editieren.

    Warum tust du dies nicht gleich mit Hilfe eines regulären Ausdrucks?

    open ( FH, "$datei" ) || die "Can't open $datei: $!";
    while ( <FH> ) {
      if ( $_ =~ /^$muster$/ ) {           # passt das Muster auf die eingelesene Zeile?
        push(@newlines, $neuertext);       # ersetze diese durch den gewünschten Text
      }
      else {
        push(@newlines, $_);               # ansonsten erhalte die Originalzeile
      }
    }
    close FH;

    Vielleicht hilft's.

    Freundschaft!
    Siechfred

  4. Auszug aus der Perl-Datei

    dringend würde ich dir raten use strict zu verwenden und Warnungen anzuschalten. Damit kannst du auf jeden Fall Tippfehler o.ä. ausschliessen.

    @alldats=<*.html>;   # Erfassen aller HTML-Dateien im Ordner

    Du bist Sicher, dass du im richtigen Ordner bist?
    Außerdem würde ich diese Dateien nicht in einem array abspeichern, es sei denn du brauchst diese Daten später nochmal.

    Also:

    while( <*.html> ){

    my $datei = $_;

    Das solltest du auf jeden Falll mache, da du später diesen Wert wiederverwenden willst und du kannst nie sicher sein, das $_ nicht überschrieben wird.

    open(HTML,"<$_")   # Öffnen zum Lesen

    Bei open sollte man auf jedne Fall den Rückgabewert prüfen:

    open(HTML , $datei) || die "Kann datei nicht öffnen, weil: $!";

    @datinh=<HTML>;
       foreach(@datinh)
       {
        $p++;
        if(/<!-- Ticker:Anfang -->/) # Wenn Kommentar-Position gefunden ..
        {
         $tickerid=$p; # Merken der Position
        }
       $p++;
       }

    Du kannst ohne Problem, nach dem if die Schleife verlassen, wenn du keine anderen Aktionen mehr ausführen möchtest

    my $tickerid = 0;
    my @datinh = <HTML>;

    foreach(@datinh)
    {
    $p++;
    next unless /<!-- Ticker:Anfang -->/; # weiter wenn nicht gefunden

    $tickerid = $p; # Merken der Position
    last;
    }
    close(HTML);

    $datinh[$tickerid + 2] = $form{'tickertext'};

    open(HTML, ">$datei") || die "Kann $datei nicht öffnen, weil: $!";
    print HTML "@datinh";
    close HTML;

    Struppi.