A propos des listes

From Base de connaissances eggdrops & TCL
Jump to: navigation, search

Une erreur très commune en TCL amène les débutants à penser que ce langage de scripting est "bugué", "peu fiable" car un codage peu scrupuleux amène fréquement à une mauvaise gestion des méta-caractères ({,},\,[,],',") alors qu'en respectant quelques règles simples, ils ne posent évidement aucun problème.

Le TCL n'est pas à proprement parlé un langage typé puisqu'une variable peu contenir successivement un scalaire, une liste, un nombre... toutefois il convient de faire attention à la manipulation des listes vs strings.

Ainsi une erreur commune est de tenter d'utiliser les fonctions lindex, lrange (destinées aux manipulations de Listes comme l'indique leur nom) sur des strings pour une utilisation de type tokenisation.

Les strings ne contenant pas de méta-caractères sont converties en listes de façon implicite sans problème ce qui n'est pas le cas pour les strings en comprenant. Il est toutefois possible effectivement d'utiliser ses fonctions pour ce but, mais il faut évidement les convertir en liste au préalable avec la fonction split.

set templist [split $my_string]

Ensuite on peut prendre un élement de cette liste, correspondant à un mot habituel, via lindex:

set firstword [lindex $templist 0]

Notez que lindex retourne une string, alors que lrange retourne une liste, ainsi pour afficher de manière correcte, il convient de reconvertir la liste retournée en string:

set templist [split $my_string]
set firstword [lindex $templist 0]
set rest [lrange $templist 1 end]
puts "Hello $firstword, [join $rest]"

Ainsi tous les méta-caractères ne sont pas interprétés comme tels et aucune erreur ne survient, sans utiliser de méthodes assez porcines consistant à les échapper avec string map, ou pire, avec des regsub lentissimes.

Pour créer une liste proprement avec $truc $machin $chose, utiliser :

lappend liste $truc $machin $chose

Pour faire une recherche avec la commande lsearch, utiliser l'option -exact.