Einfache Skriptsprache, bei der alles ein String ist
Ausführen: Datei hallo.tcl speichern und mit tclsh hallo.tcl ausführen (Tcl von tcl-lang.org).
befehl arg1 arg2set setzt Variablen, $x liest, [befehl] setzt das Ergebnis ein"..." substituiert, {...} nicht; expr {...} rechnettclsh hallo.tcl # Skript ausführen
tclsh # interaktive Konsole (%-Eingabeaufforderung)
wish gui.tcl # Skript mit Tk-Oberflächeif, for, while, foreach, switch) sind normale Befehle mit Blöcken in {}proc name {args} {rumpf} definiert Prozeduren, args fängt beliebig viele Argumenteupvar und uplevel greifen auf den Aufrufer zucatch und try behandeln Fehler; error löst sie ausproc vorzeichen {n} {
if {$n > 0} {
return "positiv"
} elseif {$n < 0} {
return "negativ"
} else {
return "null"
}
}
proc note {n} {
switch $n {
1 { return "sehr gut" }
2 - 3 { return "gut bis befriedigend" }
default { return "sonst" }
}
}
puts "[vorzeichen 5] [vorzeichen -2] [vorzeichen 0]"
puts "[note 1] / [note 3] / [note 9]"
switch -glob "datei.txt" {
*.txt { puts "Textdatei" }
*.png { puts "Bild" }
default { puts "unbekannt" }
}
set alter 20
puts [expr {$alter >= 18 ? "volljährig" : "minderjährig"}]
puts [expr {"b" in {a b c}}]
puts [expr {"x" ni {a b c}}]llength, lindex, lappend, lsort, lmapdict speichert Schlüssel-Wert-Paare: dict create/get/set/forstring, format, scan, regexp, regsub bearbeiten Textname(key)) sind eine zweite assoziative Strukturset l {5 3 9 1 7}
puts [llength $l]
puts [lindex $l 2]
puts [lrange $l 1 3]
puts [lsort -integer $l]
puts [lsort -integer -decreasing $l]
puts [lreverse $l]
puts [lsearch $l 9]
puts [concat $l {8 9}]
lappend l 11
puts $l
set l [linsert $l 1 100]
puts $l
set l [lreplace $l 0 0 ersatz]
puts $l
puts [join {a b c} ", "]
puts [split "a,b,c" ","]
puts [lmap x {1 2 3} { expr {$x * $x} }]
puts [lsearch -all {a b a c a} a]
puts [lindex {{a b} {c d}} 1 0]
puts [lsort -unique {c a b a c}]
puts [lrepeat 3 x]
lassign {1 2 3} a b c
puts "$a $b $c"open, gets, read, puts $f, close; file bietet Pfadfunktionennamespace eval kapselt Code; variable greift auf Namespace-Variablen zuuplevel, eval und {*} machen eigene Kontrollstrukturen möglichset datei [file join [pwd] "tcl-demo.txt"]
set f [open $datei w]
puts $f "eins"
puts $f "zwei"
puts -nonewline $f "drei"
close $f
set f [open $datei r]
set inhalt [read $f]
close $f
puts [string length $inhalt]
set f [open $datei r]
while {[gets $f zeile] >= 0} { puts "> $zeile" }
close $f
set f [open $datei a]
puts $f "\nvier"
close $f
set f [open $datei]
puts [llength [split [string trim [read $f]] "\n"]]
close $f
puts [file exists $datei]
puts [file size $datei]
puts [file extension $datei]
puts [file tail $datei]
puts [file rootname [file tail $datei]]
file delete $datei
puts [file exists $datei]clock formatiert und rechnet mit Zeitafter plant Aktionen, vwait wartet auf Ereignisse in der Ereignisschleifeexec startet Programme, env und argv liefern die Umgebungset t 0
puts [clock format $t -format "%Y-%m-%d %H:%M:%S" -gmt 1]
puts [clock scan "2024-03-15" -format "%Y-%m-%d" -gmt 1]
set sek [clock add 86400 1 day -gmt 1]
puts [clock format $sek -format "%d.%m.%Y" -gmt 1]
puts [expr {[clock seconds] > 1700000000}]
puts [clock format 1700000000 -format "%A, %d. %B %Y" -gmt 1 -locale en]
puts [string is wideinteger [clock milliseconds]]
puts [format "%.1f Tage" [expr {(1700000000 - 1600000000) / 86400.0}]]switch -regexp, regexp -all -inline und dict incr sind häufige Bausteinelassign und lsort -index machen Tabellenverarbeitung bequemuplevel erlaubt eigene Test- und Kontrollbefehleproc rpn {ausdruck} {
set stapel {}
foreach token $ausdruck {
switch -regexp -- $token {
{^-?[0-9]+(\.[0-9]+)?$} { lappend stapel $token }
{^[-+*/]$} {
set b [lindex $stapel end]
set a [lindex $stapel end-1]
set stapel [lrange $stapel 0 end-2]
lappend stapel [expr "$a $token $b"]
}
default { error "unbekanntes Token: $token" }
}
}
return [lindex $stapel 0]
}
puts [rpn {3 4 +}]
puts [rpn {5 1 2 + 4 * + 3 -}]
puts [rpn {10 4 /}]
puts [rpn {10 4.0 /}]
if {[catch {rpn {1 x +}} fehler]} { puts "Fehler: $fehler" }coroutine und yield bauen Generatoren und kooperative Abläufetrace überwacht Variablen und Befehlerename ersetzen; info liefert Introspektionproc generator {} {
yield
for {set i 1} {$i <= 5} {incr i} { yield [expr {$i * $i}] }
return -code break
}
coroutine quadrate generator
while 1 {
set wert [quadrate]
puts -nonewline "$wert "
if {[catch {quadrate} _]} break
}
puts ""
proc fib_gen {} {
yield
set a 0; set b 1
while 1 {
yield $a
lassign [list $b [expr {$a + $b}]] a b
}
}
coroutine fib fib_gen
for {set i 0} {$i < 10} {incr i} { puts -nonewline "[fib] " }
puts ""
rename fib {}expr {...} mit Klammernputs [info commands pu*]
puts [string length [info patchlevel]]
puts [expr {[llength [info commands]] > 100}]
puts [lsort [list banane Apfel kirsche]]
puts [lsort -nocase [list banane Apfel kirsche]]
puts [join [lmap w {a b c} {string toupper $w}] ""]
puts [expr {0.1 + 0.2}]
puts [expr {1.0 * 3}]
puts [expr {entier(2.9)}]