2017-06-19 4 views
-3

Ich habe eine Textdatei mit drei Vorkommen der Zeichenfolge 'Objekt'.Ersetzen Sie eine Zeichenfolge mit einer anderen Zeichenfolge jedes Mal, wenn es auftritt

There is an object on the table 
The object is under the chair 
There might be an object in my pocket 

Ich mag einen Perl-Skript schreiben, mit einer anderen Zeichenfolge jedes Vorkommen von ‚Objekt‘ zu ersetzen, die in einem Array aus drei Elementen enthalten. Das erste Element des Arrays wird dem ersten Vorkommen von 'Objekt', das zweite Element dem zweiten Vorkommen usw. zugeordnet.

Zum Beispiel, wenn

my @pattern = ("apple", "mango", "orange"); 

Dann ist der Ausgang sein muss:

There is an apple on the table 
The mango is under the chair 
There might be an orange in my pocket 

Antwort

5

Es gibt eine nützliche Funktion von Perl, das heißt /e Flag auf regex, dass ‚sagt einen Ausdruck auswerten.

So können Sie es wie folgt tun:

#!/usr/bin/env perl 
use strict; 
use warnings; 

my @pattern = ("apple","mango","orange"); 

while (<DATA>) { 
    s/object/shift @pattern/eg; 
    print ; 
} 

__DATA__ 
There is an object on the table 
The object is under the chair 
There might be an object in my pocket 

Obwohl beachten Sie, dass, weil Sie shift@pattern ing es wird leer aus, wie Sie gehen. (Die vierte Ersetzung wird "undefiniert" sein).

Aber Sie können etwas ähnliches tun, wenn Sie ein rotierendes Muster machen möchten.

#!/usr/bin/env perl 
use strict; 
use warnings; 

my @pattern = ("apple","mango","orange"); 
my $hit_count = 0; 

while (<>) { 
    s/object/$pattern[$hit_count++ % @pattern]/eg; 
    print ; 
} 

Dies hält eine laufende Summe davon, wie oft das Muster angepasst hat, und verwendet den Modulo-Operator das richtige Array-Element zu wählen, so erhalten in rotierenden um zukünftige Treffer ersetzt.

+3

Sie brauchen 'shift @ pattern' anstelle von' pop'. – Borodin

+0

Guter Punkt. Ich werde es bearbeiten. – Sobrique

+0

Feine Antwort und Erklärung ... – ssr1012

Verwandte Themen