Tcl - Datentypen

Strings

Strings sind der wichtigste Datentyp in Tcl. Ursprünglich wurden alle anderen Datentypen intern als Strings geführt und nur bei Operationen entsprechend umcodiert. Um Tcl zu beschleunigen, werden nun intern Objekte geführt, die Daten in ihrem "natürlichen" Typ zusätzlich speichern.

Für die Stringbehandlung gibt es eine Zahl von Basisfunktionen, dazu kommen Format- und Scanfunctionen sowie die Behandlung regulärer Ausdrücke mit regsub (Ersetzen von Mustern) und regexp (Untersuchung auf Vorkommen von Mustern und deren Herauslösen).

Parsen von CGI-Eingaben (Sonderzeichen kommen codiert als %## (hex), Leerzeichen als +, aus Welch):

  proc Url_Decode {url} {
    # Ersetzen + durch Space (1)
    regsub -all {\+} $url { } url 
    # Ersetzen der codierten Hexzeichen durch einen Ausgabefehl für das
    # Zeichen (2)
    regsub -all {%([0-9a-hA-H][0-9a-hA-H])} $url \
      {[format %c 0x\1]} url
    # Auflösen des Ausgabebefehls (3)
    return [subst $url]
  }

  Url_Decode "a+b%e4c"
  (1) => "a b%e4c"
  (2) => "a b[format %c 0xe4]c"
  (3) => "a bäc"

Zahlen

Alle Zahlen werden zwar als Strings dargestellt, haben aber eine interne numerische Darstellung, um Operationen schneller auszuführen.

Listen

Listen entstehen durch Aneinanderreihen von Elementen. In Tcl werden sie einfach als String dargestellt, wobei die Listenelemente durch Spaces getrennt sind.
  set list {Anna Berta Claudia}
  #oder, falls Substitutionen erforderlich sind,
  set list [list Anna Berta Claudia]
Trotzdem werden Listen intern in eigenen Strukturen dargestellt, die schnelle Operationen über die Liste ermöglichen.
  llength $list
  => 3
  lindex $list 1
  => Berta
  lsearch $list B*
  => 1
  lappend list Diana
  => Anna Berta Claudia Diana, list enthält die neue Liste
Mit dem foreach-Kommando lassen sich Operationen einfach über alle Listenelemente ausführen.

Listen dürfen als Elemente wieder Listen enthalten, hier kann die Konstruktion und Auswertung allerdings etwas schwieriger werden.

TclX kennt zusätzlich keyed Lists, die stets Paare von Schlüssel und Wert enthalten, und dazu entsprechende Zugriffsfunktionen.

Felder

Felder in Tcl sind immer assoziativ und eindimensional. Ein Feld wird durch Belegen des ersten Feldelementes angelegt:
  set tage(januar) 31
Der Zugriff auf Feldelemente erfolgt analog wie auf Variablen:
  puts $tage(januar)
Werden mehrdimensionale Felder benötigt, trennt man einfach die Indices durch ein Zeichen, das sonst nicht vorkommt:
  set a(0,0) 1
  set a(0,1) 2
Man muß lediglich beachten, daß die Schreibweise der Zeichenkette immer gleich ist.

Das Kommando array liefert mit verschiedenen Parametern über die Struktur des Feldes:

  foreach x [array names tage] {
    puts "$x: $tage($x)"
  }