EMZETT.
Login

Kurz: set f [open datei r] set inhalt [read f] close f puts [string length inhalt]

Teil des Kurses Tcl

Kapitel 4 von 8 im Kurs Tcl. Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.

Dateien

set 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]

Ausgabe:

14
> eins
> zwei
> drei
4
1
20
.txt
tcl-demo.txt
tcl-demo
0

Namespaces

Namespaces kapseln Variablen und Prozeduren:

namespace eval mathe {
    variable zaehler 0
    proc quadrat {x} { return [expr {$x * $x}] }
    proc zaehle {} {
        variable zaehler
        return [incr zaehler]
    }
    namespace export quadrat zaehle
}
 
puts [mathe::quadrat 6]
puts [mathe::zaehle]
puts [mathe::zaehle]
namespace import mathe::quadrat
puts [quadrat 9]
puts [namespace exists mathe]
puts [lsort [info commands mathe::*]]

Ausgabe:

36
1
2
81
1
::mathe::quadrat ::mathe::zaehle

Skriptsubstitution mit eval, uplevel und eigene Kontrollstrukturen

Weil alles ein Befehl ist, kann man eigene Kontrollstrukturen schreiben:

proc wiederhole {n rumpf} {
    for {set i 0} {$i < $n} {incr i} { uplevel 1 $rumpf }
}
 
set zaehler 0
wiederhole 3 { incr zaehler; puts "Durchlauf $zaehler" }
 
proc mit_zeit {rumpf} {
    set ergebnis [uplevel 1 $rumpf]
    return "Ergebnis: $ergebnis"
}
puts [mit_zeit { expr {6 * 7} }]
 
set befehl {puts "dynamisch"}
eval $befehl
set op +
puts [expr "3 $op 4"]
puts [{*}{string toupper} abc]
puts [apply {{x y} {expr {$x + $y}}} 3 4]
set f [list string repeat "ab"]
puts [{*}$f 2]

Ausgabe:

Durchlauf 1
Durchlauf 2
Durchlauf 3
Ergebnis: 42
dynamisch
7
ABC
7
abab

Objekte mit TclOO

oo::class create Tier {
    variable name
    constructor {n} { set name $n }
    method laut {} { return "..." }
    method vorstellen {} { return "$name sagt [my laut]" }
}
 
oo::class create Hund {
    superclass Tier
    method laut {} { return "Wau" }
    method apportiere {} { return "holt Stock" }
}
 
oo::class create Katze {
    superclass Tier
    method laut {} { return "Miau" }
}
 
set tiere [list [Hund new "Rex"] [Katze new "Mimi"]]
foreach t $tiere { puts [$t vorstellen] }
puts [[lindex $tiere 0] apportiere]
puts [info object class [lindex $tiere 1]]
foreach t $tiere { $t destroy }

Ausgabe:

Rex sagt Wau
Mimi sagt Miau
holt Stock
::Katze

Merke

  • Dateien: open, gets, read, puts $f, close; file bietet Pfadfunktionen
  • namespace eval kapselt Code; variable greift auf Namespace-Variablen zu
  • uplevel, eval und {*} machen eigene Kontrollstrukturen möglich
  • TclOO bringt Klassen, Vererbung und Methoden

Übungsaufgabe

Schreibe eine Klasse Konto mit einzahlen und kontostand.

Quiz zur Selbstkontrolle

Weiter im Kurs

Zurück: Listen, Dictionaries und Strings

Weiter: Ereignisse, Zeit und Ökosystem

Alle Kapitel: Tcl im Überblick