Andy: Textteile ersetzen

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

  1. 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

    --
    水-金-地-火-木-土-天-海-冥
    1. 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

      1. 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.

        --
        Javascript ist toll (Perl auch!)
        1. 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 ?

          1. 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.

            --
            Javascript ist toll (Perl auch!)