Textteile ersetzen
Andy
- perl
Ich wollte das Problem eigentlich mit einer split Funktion angehen, leider bisher ohne Erfolg.
Das Problem:
Ich lese zuerst ein Text File ein:
my @FILE = cat file
;
In dem File befindet sich ein TAG "#REPLACE"
Alles was hinter dem FLAG steht soll gelöscht werden und gegen den Inhalt eines weiteren Files (file2)ersetzt werden.
Schon mal danke für die Hilfe
Hey,
Ich lese zuerst ein Text File ein:
my @FILE =cat file
;
mit einem Systemaufruf? Das ist schlechter Stil, weil vermeidbar. Zur Portabilität liest du die Datei besser mit Bordmitteln ein, und du bist auch gleich flexibler bei dem nächsten Teilproblem.
my @file1;
{
open my $fh, '<', 'file1' or die "could not open file1 for reading: $!";
my @file1 = (<>); # <>-Operator im Listenkontext -> slurp die ganze Datei
close $fh;
};
In dem File befindet sich ein TAG "#REPLACE"
Alles was hinter dem FLAG steht soll gelöscht werden
Das kann man auch anders auffassen: wenn wir diese Zeile erreichen, hören wir auf, die Datei zu lesen. Ersetze also das unbedingte Einlesen durch eine bedingte Schleife.
while (<>) {
push @file1, $_; # aktuelle Zeile anhängen
last if /^#REPLACE/; # wenn aktuelle Zeile damit beginnt, Schleife beenden
};
und gegen den Inhalt eines weiteren Files (file2)ersetzt werden.
Lies die zweite Datei in ein Array, dann hänge es an das zuerst zubereitete an. Wie die beiden Teilschritte auszusehen haben, weißt du jetzt schon.
Hinweis 1: Der ganze Code ist ungetestet.
Hinweis 2: Mit noch weniger Code geht das ganze Problem mit Tie::File zu lösen, wo du Dateien mit Arrayfunktionen behandeln kannst. http://perldoc.perl.org/Tie/File.html
Erstmal danke für die schnelle Antwort, ich habe den Code von dir nun so eingebaut, allerdings hängt sich damit das Skript auf.
Habe ich da was falsch verstanden?
my @file1;
{
open my $fh, '<', 'file1' or die "could not open file1 for reading: $!";
my @file1 = (<>); # <>-Operator im Listenkontext -> slurp die ganze Datei
close $fh;
};
while (<>) {
push @file1, $_; # aktuelle Zeile anhängen
last if /^#REPLACE/; # wenn aktuelle Zeile damit beginnt, Schleife beenden
};
print @file1;
Hey,
Ich lese zuerst ein Text File ein:
my @FILE =cat file
;
mit einem Systemaufruf? Das ist schlechter Stil, weil vermeidbar. Zur Portabilität liest du die Datei besser mit Bordmitteln ein, und du bist auch gleich flexibler bei dem nächsten Teilproblem.
my @file1;
{
open my $fh, '<', 'file1' or die "could not open file1 for reading: $!";
my @file1 = (<>); # <>-Operator im Listenkontext -> slurp die ganze Datei
close $fh;
};
>
> > In dem File befindet sich ein TAG "#REPLACE"
> > Alles was hinter dem FLAG steht soll gelöscht werden
> Das kann man auch anders auffassen: wenn wir diese Zeile erreichen, hören wir auf, die Datei zu lesen. Ersetze also das unbedingte Einlesen durch eine bedingte Schleife.
>
> ~~~perl
> while (<>) {
> push @file1, $_; # aktuelle Zeile anhängen
> last if /^#REPLACE/; # wenn aktuelle Zeile damit beginnt, Schleife beenden
> };
>
und gegen den Inhalt eines weiteren Files (file2)ersetzt werden.
Lies die zweite Datei in ein Array, dann hänge es an das zuerst zubereitete an. Wie die beiden Teilschritte auszusehen haben, weißt du jetzt schon.Hinweis 1: Der ganze Code ist ungetestet.
Hinweis 2: Mit noch weniger Code geht das ganze Problem mit Tie::File zu lösen, wo du Dateien mit Arrayfunktionen behandeln kannst. http://perldoc.perl.org/Tie/File.html
Habe ich da was falsch verstanden?
Probier's mal so
open FH, '<file1' or die "could not open file1 for reading: $!";
while(<FH>)
{
last if /^#REPLACE/; # wenn aktuelle Zeile damit beginnt, Schleife
push @file1, $_; # aktuelle Zeile anhängen
}
Struppi.
Danke jetzt funktioniert es, allerdings wird das Replace tag jetzt jedesmal abgeschnitten. Ist es möglich, das Einlesen nicht bei dem Tag(#REPLACE) sondern eine Zeile danach aufzuhören ?
Danke jetzt funktioniert es, allerdings wird das Replace tag jetzt jedesmal abgeschnitten. Ist es möglich, das Einlesen nicht bei dem Tag(#REPLACE) sondern eine Zeile danach aufzuhören ?
Klar, einfach das die Zeilen in der schleife vertauschen.
Struppi.