Dieses Testprogramm baut einen Testring ruft die Routine auf:
Code: Alles auswählen
/* testaufruf repl.cmd */
string="xbc"
do i=1 to 15
string=string||"xbc"
end
rc=repl(string, "x", "a")
say "original:" string
say "new: " rc
exit
Code: Alles auswählen
/* replace string */
parse arg string, old_s, new_s
string="+"||string||"+"
new_string=""
do until string=""
parse var string sub_string (old_s) string
if new_string="" then new_string=(sub_string)
else new_string=new_string||new_s||sub_string
end
new_string=substr(new_string,2,length(new_string)-2)
return new_string
Zum Replacer:
Damit auch das erste und letzte Zeichen (Zeichenkette geht auch) bei Bedarf ausgetauscht werden kann, trickse ich in Zeile 3: es wird vorne und hinten jeweils vorübergehend ein Zeichen an den Quellstring gefügt. Hier ist es ein "+", ist aber egal. Später in Zeile 16 wird einfach das erste und letzte Zeichen wieder entfernt. Zuerst hatte ich das mit Strip gemacht, aber so ist es sicherer.
Soweit so gut.
Was mich aber wundert ist, das es auch geht, wenn mehrere austauschende Zeichen direkt hintereinander auftreten.
Beispiel:
Wenn der Quellstring "aaaaa" lautet, und ich alle "a" gegen "b" austauschen möchte.
Mein Code macht daraus zunächst "+aaaaa+".
Beim ersten PARSE Durchlauf wird dann zerlegt in "+" und den Reststring "aaaa+". Das erste "a" im Quelsstring ist ja ich sag mal der "Separator", und nun nicht mehr dabei. Okay.
Aber nun im zweiten Durchlauf wird ja der Reststring aaaa+ geparsed. Und nun haben wir ja an erster Stelle ein "a". Und trotzdem funktioniert das.
Also entweder sehe ich den Wald vor lauter Bäumen nicht. Oder PARSE VAR arbeitet hier nicht völlig stringent. Beim ersten Aufruf darf als erstes Zeichen nicht das zu ersetzende Zeichen (der PARSE Separator) stehen, bei weiteren Durchläufen dann aber schon. Wobei die Routine auch nur deshalb so einfach funktioniert.
Versteht ihr, was ich meine?