Eine rhetorische Figur ist die Einleitung eines jeden Absatzes mit derselben Redewendung. "Für Verwendungszweck Betrag Gulden." Manchmal wird "Gulden" auch mit "fl." abgekürzt.
Diesen Text kann man durch
perl -p -i -e 's/(Für.*)(fl|Gulden)\./$1Euro./' landbote.txtaktualisieren.
Wie sucht Perl nun nach dieser Textstelle? Antwort: gierig!
Problem bei der obigen Angabe: Man hängt an der Bedingung, dass in derselben Zeile tatsächlich nur einmal hinter "Für" "Gulden." oder "fl." kommt! Wenn diese Ausdrücke mehrmals vorkommen, wählt der Pacman immer den maximal möglichen String, der von der ersten Suchposition aus gefunden wird (leftmost longest).
Daher als allgemeine Regel: Baue spezifische Suchmuster ein! Besonders
ungeeignet: .*
Besser: Ermögliche das Auffinden nur innerhalb desselben Satzes. Möglichkeit:
perl -p -i -e 's/(Für[^!?.:;]*)(fl|Gulden)\./$1Euro./' landbote.txt
#!/usr/bin/perl -w while(<>) { my @matches = ($_ =~ m/(<[^>]*>)/g); foreach $tag(@matches) { print $tag, "\n"; } }Was nicht klappt, ist ein Matching in der Form von
/<b>[^</b>]*</b>/
.
Hier muss man sich anders behelfen.
#!/usr/bin/perl -w while(<>) { my @matches = (m{<(\w+).*?>.*?\1>}g); foreach $tag(@matches) { print $tag, ":\t", $_; } }In diesem Skript wird jedes gepaarte Tag erkannt und angezeigt.
Die "Bescheidenheits-Option" ist ein Merkmal von Perl gegenüber anderen Programmen und Sprachen mit Verarbeitung regulärer Ausdrücke! Sie sollte aber nur dort eingesetzt werden, wo keine andere Möglichkeit zupaß kommt. Besser im Sinne der Effizienz ist, durch spezifischere Muster Mißverständnisse zu vermeiden.