[Allegro] Trick 48: Praezises Einfuegen
Bernhard Eversberg
ev at biblio.tu-bs.de
Do Jul 19 08:27:45 CEST 2007
Trick 48 : Präzisions-Einfügungen
Aufgabe: Schnell mal eben in eine Zeichenfolge an einer bestimmten
Position 1 oder mehr Zeichen einfügen, und zwar
mit oder ohne Ersetzung von 1 oder mehr dort stehenden Zeichen
Warum? Man hat zuweilen Zeichenfolgen, in denen an bestimmten (festen)
Positionen bestimmte Angaben stehen, die man durch etwas anderes
ersetzen will.
Hinweis: Zum Ersetzen von exakten Zeichenfolgen an beliebiger Stelle
durch andere gibt es den Befehl insert %abc%xyz%
Zum Ersetzen einzelner Zeichen oder Doppelzeichen durch andere
im gesamten Text (das nennt man "Umcodierung") gibt es das
Instrumentarium des Befehls xcode
Lösung:
Man schreibt sich eine Datei stri.inc (siehe unten) und bindet sie
mit "include stri.inc" ein.
So wird die Funktion dann benutzt:
Wenn in das Feld #789 an der Position 11 die Zeichen "abc" eingesetzt
werden sollen, dort genau 2 Zeichen ersetzend, die vorher da stehen,
dann macht man folgendes:
var #789
Startstring
ins #usT
Befehlsstring (kann beliebig konstruiert werden, auch aus Variablen!)
var "10,abc,2"
(Statt , als Trenner ist auch / möglich)
Aufruf
perf stri
Ergebnis in iV nach #789 sichern
ins #789
var "Resultat: " #789
mes
... weitere Aktionen
Am Ende das UP einbinden:
include stri.inc
Und dies ist das Unterprogramm stri.inc
**********************************************************************
STRI.INC : Zeichen an fester Position in eine Zeichenfolge einfuegen
2007-07-17 u.U. mit Ersetzung vorhandener Zeichen
Aufruf : Man besetzt zuerst folgende Variable:
#usT : die Ausgangs-Zeichenfolge
iV : zahl1,zeichenfolge,zahl2 oder / statt ,
die beiden Zahlen muessen positive ganze sein oder 0
zahl2 mit dem vorangehenden Komma darf fehlen
Bedeutung: zahl1 Zeichen vom Anfang von #usT belassen
dann die zeichenfolge anhaengen
vom Rest von #usT zahl2 Zeichen wegnehmen,
und was noch von #usT uebrig ist, anhaengen
Beispiele:
Das vierte Zeichen durch x ersetzen
var "3,x,1"
In #upo steht Position, in #uez die einzufueg. Zeichen
in #uaz ANz. der zu ersetzenden Zeichen
var #upo "," #uez "," #uaz
Hinter dem 10. Zeichen Inhalt von #uab zwischenfügen
var "10," #uab ",0" oder var "10," #uab
Vorn 2 Zeichen durch abcdeg ersetzen, Rest belassen
var "0,abcdeg,2"
(einfacher mit var "abc" #usT(2,0) )
Hinter dem 2. Zeichen abcdeg einsetzen, Rest weg
var "2,abcdeg,1000"
(einfacher mit var #usT(0,2) "abcdeg" !)
Dann der Aufruf:
perf stri
Ergebnis steht danach in der iV
UPro beginnt hier
end
Setze
#uZ1 = zahl1 , #uZ2=zahl2 , #uZB = Zeichenfolge bei Beginn
:stri
Kontrolle beim Testen
mes
ins #uZB
var #uZB(f"0123456789")
if "/" jump stri:s
if not "," return
Komma ist Trennung:
var #uZB(e",")
ins #uZ1
var #uZB(b"," b",")
ins #uZ2
Trennsymbol ,
#uZT,
jump stri:w
/ ist Trennung:
:stri:s
var #uZB(e"/")
ins #uZ1
var #uZB(b"/" b"/")
ins #uZ2
Trennsymbol /
#uZT/
:stri:w
eval #uZ1 + #uZ2
Position, wo der Rest beginnt
ins #uZ3
Manipulations-Ausdruck in die iV schreiben:
(beachte den Nebentrick mit dem Trennsymbol #uZT)
var #uZ1
if not "0" var "#usT(0," #uZ1 " F' ') #uZB(b'#uZT' e'#uZT') #usT(" #uZ3
",0)"
if "0" var "#uZB(b'#uZT' e'#uZT') #usT(" #uZ3 ",0)"
zur Kontrolle beim Testen den Ausdruck zeigen:
mes
Ausdruck auswerten (das ist der eigentliche Trick!)
var
Nun steht das Erg. in der iV
Hilfsvar. loeschen
#uZT
#uZB
#uZ1
#uZ2
#uZ3
return
*********************************************************************
Mehr Informationen über die Mailingliste Allegro