Notions de base la programmation de TCL
(Langue de commande de l'outil)
Le langage TCL a été inventé comme un langage pour le contrôle de petits logiciels. Ces petits logiciels ou des commandes qui interagissent les systèmes embarqués.
TCL est très embeddeable. Il a été intégré dans un logiciel appelé expect de contrôler les programmes interactifs. Au Apple Computer, il a été intégré dans un logiciel appelé Curare et utilisé pour tester les composants du système Mac OS.
TCL est très embeddeable. Il a été intégré dans un logiciel appelé expect de contrôler les programmes interactifs. Au Apple Computer, il a été intégré dans un logiciel appelé Curare et utilisé pour tester les composants du système Mac OS.
Sortie
.
#!/usr/bin/tclsh puts "Hello"
Variables
.
#!/usr/bin/tclsh set num 5 set char 'a' set string "This is a string" puts "Number is $num" puts "Character is a $char" puts "String is \"$string\"."
Constantes
Le langage TCL ne supporte pas la notion de constantes ou des variables immuables. Cependant, on peut créer cette installation en utilisant la commande «trace». Ci-dessous est un extrait de code échantillon utilisé pour configurer la fonctionnalité de constantes dans TCL.
#!/usr/bin/tclsh # functions used to implement constant-like facility proc _ctr {val n1 n2 ops} { upvar $n1 var set var $val } proc const {vName v} { uplevel [list trace variable $vName r [list _ctr $v]] } # set immutable value const PI 3.1415927 # attempt to change value set PI 3; # try to change PI incr PI; # try to increment PI # output result puts $PI
Arithmétique
.
#!/usr/bin/tclsh # integer arithmetic set width 5; set length 6 set area [expr $width * $length] puts "The area of a square(width=$width, length=$length) is $area" # bolean logic set result [expr True && False || True] puts "The statement (true AND false OR true) is $result"
.
#!/usr/bin/tclsh set PI 3.1415927 set radius 3 set area [expr $PI * $radius ** 2] puts "The area of a circle is $area"
.
#!/usr/bin/tclsh set PI 3.14115927 puts [ format "The cosine of pi/4 is: %f" [expr cos($PI/4)]] # comment
Entrée
.
#!/usr/bin/tclsh # primpt and get input puts -nonewline "Enter your name: " flush stdout gets stdin name # output result puts "Hello $name"
Choix
Voici une section simple qui évalue un certain nombre:
#!/usr/bin/tclsh # prompt and get input puts -nonewline "Input a number: " flush stdout gets stdin number # evaluate input & print result if {$number > 0} { puts "Number is greater than 0" } elseif {$number < 0} { puts "Number is less than 0" } else { puts "Number is 0" }
La construction de «switch» permettra de comparer une chaîne à un motif. Si le motif trouve une correspondance, un bloc de code est exécuté.
#!/usr/bin/tclsh # prompt and get input puts -nonewline "Input a character: " flush stdout set keypress [read stdin 1] # switch on the input (match pattern) and output result switch -regexp $keypress { [a-z] { puts "Lowercase letter" } [A-Z] { puts "Uppercase letter" } [0-9] { puts "Digit" } default { puts "Punctuation, whitespace, or other" } }
Voici comment faire la même fonctionnalité avec la commande «if» que nous avons eu avec la commande «switch».
#!/usr/bin/tclsh # prompt and get input puts -nonewline "Input a character: " flush stdout set keypress [read stdin 1] # evaluate match to pattern and output result if {[regexp {[a-z]} $keypress]} { puts "Lowercase letter" } elseif {[regexp {[A-Z]} $keypress]} { puts "Uppercase letter" } elseif {[regexp {[0-9]} $keypress]} { puts "Digit" } else { puts "Punctuation, whitespace, or other" }
Boucles
Le langage TCL dispose de trois mécanismes en boucle: «foreach», «for», et «while».
#!/usr/bin/tclsh # while loop w/ counter set count 10 while {$count > 0} { puts "Count is $count" incr count -1 }
#!/usr/bin/tclsh # for loop w/ counter for {set count 10} {$count > 0} {incr count -1} { puts "Count is $count" }
#!/usr/bin/tclsh # while loop until user quits while {true} { puts -nonewline "Enter you name (quit to Exit): " flush stdout gets stdin answer if {$answer == "quit"} { break } else { puts "Hello $answer" } }
#!/usr/bin/tclsh # foreach construction /w exec foreach item [exec "ls"] { if {[file isdirectory $item]} { puts "$item is a directory." } else { puts "$item is not a directory." } }
Cela ne fonctionne pas avec tcl 8.5 sur Cygwin 7.1.16 (Windows NT 6.1). Le script fonctionne très bien avec ActiveTcl 8.5.12 sur Windows NT 6.1. Il fonctionne aussi très bien sur Ubuntu 12.04.1 LTS (Precise Pangolin).
Tableaux
TCL n'est pas réellement une structure de données de tableau. TCL a une structure de données appelée «list» qui est en réalité simplement une chaîne de caractères avec chaque élément séparé par des espaces.
#!/usr/bin/tclsh # create empty list set nicknames [list] # insert elements by index set nicknames [linsert $nicknames 0 bob] set nicknames [linsert $nicknames 1 ed] set nicknames [linsert $nicknames 2 steve] set nicknames [linsert $nicknames 3 ralph] set nicknames [linsert $nicknames 4 joe] set nicknames [linsert $nicknames 5 deb] set nicknames [linsert $nicknames 6 kate] # print length puts "The total nicknames are: [llength $nicknames]" # enumerate full list puts "The nicknames are: [lrange $nicknames 0 end]"
Les tableaux peuvent être simulés à l'aide d'une chaîne délimitée par des espaces. C'est ainsi que pour parcourir une liste en utilisant la commande «foreach».
#!/usr/bin/tclsh # create populated list set nicknames [list bob ed steve ralph joe deb kate] # enumerate list one element at a time puts "The names are: " foreach name $nicknames { puts " $name" }
C'est une façon de parcourir une liste par un indice.
#!/usr/bin/tclsh # populate full list set nicknames [list bob ed steve ralph joe deb kate] # enumerate through list elements by index puts "The names are: " for {set count 0} {$count < [llength $nicknames]} {incr count} { puts -nonewline " nicknames\[$count\]=" puts [lindex $nicknames $count] }
Tableaux associatifs
Le langage TCL soutient les tableaux associatifs. En TCL, ils sont tout simplement appelés «array».
TCL ne peut pas énumérer les valeurs dans un tableau associatif. Une alternative est de retourner les deux clés et des valeurs de «array get», puis découpé dans une «list», et la recherche de valeurs dans la «list».
TCL ne peut pas énumérer les valeurs dans un tableau associatif. Une alternative est de retourner les deux clés et des valeurs de «array get», puis découpé dans une «list», et la recherche de valeurs dans la «list».
#!/usr/bin/tclsh # insert one element at a time set ages(bob) 34 set ages(ed) 58 set ages(steve) 32 set ages(ralph) 23 set ages(deb) 46 set ages(kate) 19 # enumerate & print keys puts "Keys (names): [array names ages]" # enumerate & print values puts -nonewline "Values (set ages): " puts [lsearch -all -inline -regexp [split [array get ages]] {[0-9]+}]
Il est facile d'ajouter de nouveaux éléments à un tableau.
#!/usr/bin/tclsh # populate initial array array set ages {bob 34 ed 58 steve 32 ralph 23} # append more items into array array set ages {deb 46 kate 19} # iterate through array, print key/value pairs foreach name [array names ages] { puts "ages\[$name\]=$ages($name)" }
On peut parcourir le tableau à l'aide de la clé, ou nous pouvons utiliser deux paires clé-valeur.
#!/usr/bin/tclsh # populate initial array array set ages {bob 34 ed 58 steve 32 ralph 23} # append more items into array array set ages {deb 46 kate 19} # iterate through array, print key/value pairs foreach {name age} [array get ages] { puts "ages\[$name\]=$age" }