Datei wird falsch editiert
Kay Lerch
- perl
0 Kay Lerch0 Margin-Auto0 Siechfred0 Struppi
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.
Aus versehen wird $p zweimal in der Schleife inkrementiert. Ist nur eine Fehler im Beitrag. Im Script ist das nicht der Fall.
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
Ja, $p wird initialisiert. Die ausgegebene Tickerid hat seltsamerweise keinen Wert.
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
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.