Obwohl uns AutoLISP nur magere 4 Funktionen zur Bearbeitung
von Zeichenketten (auch Strings genannt) zur Verfügung stellt,
sollten wir uns keine grauen Haare wachsen lassen, da diese
Funktionen ein ausreichendes Grundwerkzeug zur Verfügung stellen,
um sich weitere Funktionen daraus abzuleiten, mit denen dann ein
wirklich rationelles Arbeiten möglich ist.
Wir müssen Zeichenketten z.B dann bearbeiten, wenn es sich um
Benutzereingaben handelt, die analysiert werden sollen, wenn wir
Daten aus Dateien lesen wollen, wenn Texte in der Zeichnung ausgegeben
werden sollen und vor allem, wenn es darum geht, Ausgaben an die
Kommandozeile zu erzeugen.
Die vier Grundfunktionen, die wir zur Verfügung haben, sind
(strcat),
(strcase),
(substr) und
(strlen).
Fangen wir bei der letzgenannten an:
(strlen) gibt die Länge
einer Zeichenkette zurück:
(strlen "Dies ist eine Zeichenkette" ) => 26
Was man dazu noch wissen sollte, ist die Tatsache, dass eine
Zeichenkette ohne Länge (Leerzeichenkette) nicht identisch mit
nil ist, sondern einfach in der Form "" dargestellt
wird. Zwischen den Anführungszeichen ist natürlich keine Leerstelle,
denn das wäre dann eine Kette mit der Länge 1.
(strcat) verbindet zwei (oder mehr) Zeichenketten zu einer
einzigen:
(strcat "Zeichen" "kette") => "Zeichenkette"
Wir hatten ja bereits kurz mit der Funktion
(princ) zu tun.
Diese gibt Zeichenketten (und auch alle anderen Datentypen) am
Bildschirm aus.
(princ "Dies ist ein Text") => Dies ist ein Text
Wie wir sehen, werden die Anführungszeichen von (princ) am
Bildschirm nicht mit angezeigt. Einen Zeilenumbruch können wir
durch Einsetzen des Steuerzeichens '\n' in die Zeichenkette
erzwingen.
(princ "Dies ist \nein Text")
=> Dies ist
=> ein Text
Wenn wir eine Zeichenkette in einer Variablen gespeichert haben,
können wir
(princ) genauso anwenden:
(setq var1 "Ein anderer Text")
=> "Ein anderer Text"
(princ var1)
=> Ein anderer Text
Wenn wir jetzt einen Zeilenumbruch mit der Ausgabe von var1
verbinden möchten, können wir das in Verbindung mit
(strcat).
Wir haben ja keine Möglichkeit, den Zeilenumbruch direkt in die
Zeichenkette einzusetzen.
(princ (strcat "\n" var1))
; führt erst einen Umbruch durch und gibt
; dann die Zeichenkette aus
(princ (strcat var1 "\n"))
; machtes in umgekehrter Reihenfolge
Wir wissen nun, wie man Zeichenketten zusammensetzt. Auseinandernehmen
können wir sie mit
(substr). Diese Funktion gibt Teilzeichenketten
zurück. Die Syntax ist so:
(substr <zeichenkette> <position> [<anzahl>])
Wenn das letzte Argument weggelassen wird, gibt uns
(substr)
den Rest der Zeichenkette ab
position wieder. Zur Verdeutlichung
der Arbeitsweise von
(substr ...) einige Beispiele:
(substr "Wort" 2 3) => "ort"
(substr "computer" 4) => "puter"
(substr "Anfang" 1 1) => "A"
Das letzte Zeichen einer Kette können wir immer mit folgendem
Ausdruck ermitteln:
(substr <zeichenkette> (strlen <zeichenkette>))
Noch ein paar Worte dazu, wie AutoLisp Zeichenketten verarbeitet:
Sie erinnern sich sicherlich daran, daá Zeichenketten nicht
evaluiert werden bzw. eine Evaluation immer die Zeichenkette selbst
ergibt. Was wir auch noch wissen, ist, dass Zeichenketten - im
Gegensatz zu Symbolen - von LISP nicht automatisch in Grossbuchstaben
umgesetzt werden. Es soll aber auch nicht unerwähnt bleiben, dass
Zeichenketten beliebig lang sein können - mit einer Einschränkung
allerdings: Zeichenketten, die Sie im Quellcode oder über die Kommandozeile
direkt eingeben, sind auf 132 Zeichen beschränkt. Hier kann aber
ggf. mit
(strcat) nachgeholfen werden.
Lassen Sie uns nun noch kurz die vierte Funktion durchnehmen, nämlich
(strcase). Wenn wir
(strcase "Dies ist ein Text") eingeben,
bekommen wir "DIES IST EIN TEXT" zurück.
(strcase)
setzt also Zeichenketten in Groábuchstaben um. Wenn wir diese Funktion
aber mit einem weiteren Argument aufrufen, setzt sie alles
in Kleinbuchstaben um. Der Wert des zweiten Arguments ist dabei
unerheblich, es muss nur vorhanden und ungleich
nil sein:
(strcase "Dies ist ein Text" 1) => "dies ist ein text"
Diese Umsetzung in Gross- bzw. Kleinbuchstaben hat aber in älteren
Versionen von AutoCAD einen gewaltigen Haken, zumindest wenn es um
die deutsche Sprache geht - Umlaute und 'ß' werden von
(strcase) nämlich ignoriert.
(strcase "Rückseite" 1)
ergibt also "RüCKSEITE". Dies kann optisch sehr störend sein, und es
hat noch einen weiteren schwerwiegenden Nachteil:
(strcase)
wird eingesetzt, wenn Zeichenketten unabhängig von der
Gross-/Kleinschreibung miteiander verglichen werden sollen. Die
fehlende Umsetzung von Umlauten kann hier zu Fehlern führen. In den
neueren AutoCAD-Versionen ist dieses Problem allerdings behoben, es
werden auch die Umlaute und 'ß' umgesetzt.
Das war erst einmal das Wichtigste, was es zum Thema
Zeichenketten-Funktionen zu sagen gibt. Im nächsten Kapitel werden
wir uns mit einigen Funktionen zum Umwandeln von Zahlen in Zeichenketten
usw. befassen.
Übungsaufgaben
-
Von den vier hier vorgestellten Funktionen sind nur zwei
wirklich unverzichtbar, die anderen beiden könnte man sich
auch selbst schreiben. Welches sind die beidenn elementaren
Funktionen?
-
Definieren Sie eine Funktion (str-first), die das erste
Zeichen eines Strings zurückgibt
-
Definieren Sie eine Funktion (str-last), die das letzte
Zeichen eines Strings zurückgibt
-
Definieren Sie eine Funktion (str-pos), die feststellt,
ob in einer Zeichenkette (1. Argument) ein bestimmtes Zeichen
vorkommt (2. Argument). Die Funktion soll, wenn das Zeichen
nicht vorkommt, 0 zurückgeben. Wenn es gefunden wurde, wird die
Position retourniert.
-
Definieren Sie eine Funktion, die mit der Syntax
(str-insert <zeichenkette> <neue-zeichenkette>
<position>) ein oder auch mehrere Zeichen in eine
Zeichenkette an der Stelle position einfügt
-
Definieren Sie eine Funktion (str-reverse <str>),
die eine Zeichenkette rückwärts zurückgibt.