Kann Perl mehrere Keywords mit einem eigenen Ersatzwort auf einmal ersetzen?

8

Betrachten Sie eine Textdatei mit dem Inhalt:

%Vor%

Und betrachten Sie den Perl-One-Liner:

%Vor%

Dies ersetzt jede Frucht mit ihrer Farbe.
Nun, könnte das irgendwie in einem einzigen s /// g statt der obigen vier gemacht werden?

Ich mache mir auch Sorgen über die Reihenfolge der Fruchtwörter.
Wenn mein Beispiel "Apfel" nicht enthält, wird keiner der anderen Ersetzungen abgeschlossen. Wie sollte ich das beheben?

Bitte beachten Sie: Ich möchte die Lösung als One-Liner behalten.
Das Definieren von Hashes, das Einlesen von Dateien und andere Lösungen, die viele Zeilen Perl-Code erfordern, führen mich nicht weiter.

Es ist eher eine Frage der Neugier als eine Frage von Leben und Tod, von der ein Projekt abhängen würde. Ärgerte mich schon seit ein paar Tagen und dachte, ein erfahrener Perl-Benutzer könnte sofort mit der Lösung helfen oder mich aus meinem Elend bringen, indem er mir klar macht, dass das nicht in Perl so gemacht werden kann, wie ich es möchte. p>     

Keve 19.01.2012, 21:53
quelle

5 Antworten

4
%Vor%     
ruz 19.01.2012, 22:02
quelle
11

Ersetzen

%Vor%

mit

%Vor%

Schneller und hat kein Problem mit a = & gt; b b = & gt; c:

%Vor%

(Sie können das « map quotemeta, » entfernen, wenn Ihre Eingabe nichts Besonderes enthält.)

(Sie können die Zeilenumbrüche entfernen, die ich zur besseren Lesbarkeit hinzugefügt habe.)

    
ikegami 19.01.2012 22:10
quelle
5

perl -pe '%a=qw(apple green pear yellow plum blue cherry red);$b=join("|",keys %a);s/($b)/$a{}/g' < fruits.txt

    
mkb 19.01.2012 22:01
quelle
1

Je nach Problem, denke ich, würde ich nur ein wenig schlampig sein und jede Spur von Nicht-Whitespace betrachten. Wenn es etwas Interessantes ist, ersetze ich es. Wenn nicht, lege ich den gleichen Text zurück.

%Vor%

Wenn das Problem noch komplizierter ist, würde mein Einzeiler so aussehen:

%Vor%

Einige der anderen Antworten zerstießen eine Regex, indem sie Strings verbinden. In einem nicht-einlinigen Programm würde ich das wahrscheinlich mit etwas wie Regex :: Assemble machen oder Regexp :: Trie . Diese Module können effiziente Alternativen aufbauen.

    
brian d foy 20.01.2012 13:21
quelle
0

Wer hat gesagt, dass Hashes sich nicht an ihre Reihenfolge erinnern können :)?

  

Wie kann ich meinen Hash an die Reihenfolge erinnern, in die ich Elemente eingefügt habe?   es?

     

Verwenden Sie die Tie::IxHash von   CPAN.

%Vor%
%Vor%     
Zaid 20.01.2012 13:38
quelle

Tags und Links