Xanti
Mouse Organist
Hi,
ja genau - und weil gesagt wird, dass das Substitut gelöscht werden soll, bin
ich beim näheren nachdenken total durcheinander gekommen - ganz offensicht-
lich werden die anderen Zeichen ja hinterher doch gezählt ... wo kommen die
denn dann her, wenn sie vorher rausgeschmissen werden
Du musst Dir vor Augen halten, wie substitute (s//) funktioniert. Der Perl-Interpreter nimmt sich jedes einzelne Zeichen des Textes vor und prüft, ob er auf das erste Zeichen des Suchmusters passt. Bei Erfolg nimmt er das nächste Zeichen dazu und prüft, ob diese beide Zeichen auf das Suchmuster passt. Wenn nein, geht er zum nächsten Zeichen und fängt wieder mit der Prüfung an. Wenn er nun eine Zeichenfolge gefunden hat, die auf das Muster passt (ich lass jetzt mal greedy aussen vor), dann nimmt er diese und ersetzt sie entsprechend. Dieses Überprüfen in unserem Beispiel funktioniert nun folgendermassen:
Code:
bsp (?<!a): | [^\w\@:] Ersetzen (und damit Löschen)
: (mit a davor) 0 0 nein
: (mit b davor) 1 0 ja
@ 0 0 nein
% 0 1 ja
a 0 0 nein
Aber gut ...
...
[*]... die Problemfälle (also Kombinationen, welche als ein Zeichen gelesen/gezählt werden müssen) sind:
Code:ts a: E: aI aU OI @6 Y6 96 U6 O6 a6 I6 E6 26 E:6
Leider ist bei so vielen Kombinationen die Split-Methode nicht mehr ratsam. Besser wäre:
Code:
perl -0777 -ne '
@l = ("E:6","ts","a:","E:","aI","aU","OI","\@6","Y6","96","U6","O6",
"a6","I6","E6","26",("a".."z"),("A".."Z"),(0..9));
foreach $l (@l) {print "$l\t$n\n" if $n=$_=~s/$l//g}
' testtext
Ich hab die Zeile für bessere Lesbarkeit umgebrochen.
Gruss, Xanti
Zuletzt bearbeitet: