Existe un moyen de differencie
set l1 {a b c}
de:
set l2 {"a" "b" "c"}
Pour etre plus precis, j'aimerai pouvoir tester que chaque element (au
sens de foreach) constituant l2 a bien ete ecris avec des guillemets
Dans les deux cas ci-dessus un foreach ne verra pas les guillemets.
Pour les voir, tu dois les enregistrer échappés :
set l3 {\"a\" \"b\" \"c\"}
Après, tu peux tester comme ça :
foreach liste {l1 l2 l3} {
foreach val [set $liste] {
if {[string index $val 0] eq {"} && \
[string index $val end] eq {"}} {
puts "liste $liste : élément $val concorde"
}
}
}
--
David Zolli
Je ne tiens pas avoir des guillemets dans mes elements, mais etre
sur que au moment de la declaration de la variable, les guillemets
on ete utilises.
Pour etre complet, je demande a un utilisateur d'ecrire un fichier du type:
set lCorrect {
"une phrase"
"une autre"
}
une erreur frequement commise est l'oubli des guillements de groupement:
set lIncorrect {
une phrase
une autre
}
j'utilise actuellement comme detrompeur
[llength $list] == [llength [split [string trim $list \n\t] \n]]
mais je ne trouve pas cela tres joli, et en plus la declaration "legale"
set lCorrect { "une phrase" "une autre" }
est faussement declaree incorrecte
Ah ! En fait, tu parles d'une liste de listes. Dans ce cas, les
guillemets peuvent tout à fait être (avantageusement) remplacés par
des accolades :
set lCorrect {
{une phrase}
{une autre}
}
De tout façon, la meilleure déclaration d'une liste de listes reste :
set lCorrect [list [list une phrase] [list une autre]]
Quant à ton test, à moins de faire saisir les éléments un par un, je
ne vois pas comment tu pourrais tester les erreurs humaines de ce
genre.
--
David Zolli
Bonjour,
Je suis du même avis que David : je pense qu'il sera impossible de
vérifier ce type d'oubli.
Le split que tu utilises actuellement sur le retour chariot me semble
tout à fait juste et pertinent dans la mesure où tu indiques
clairement aux utilisateurs qu'ils doivent utiliser cette syntaxe-là
précisément. On entre alors dans un format spécifique de fichiers qui
est décidé par ton programme (et qui, accessoirement et pour en
simplifier l'interprétation, est reconnu par TCL). Donc, pour moi, ce
n'est pas une erreur si la syntaxe
set lCorrect { "une phrase" "une autre" }
est rejetée : elle est correcte pour TCL mais pas pour ton programme.
En fait, cela n'est qu'une question de point de vue (selon si on se
place du côté du programme ou du langage).
Si un jour tu décides de changer de langage (pour refaire ton
programme en C ou en Java par exemple), vas-tu demander aux
utilisateurs de changer la structure de leurs fichiers (car elle ne
sera pas reconnue par ce nouveau langage), ou vas-tu faire en sorte
que le nouveau programme reconnaisse les fichiers actuels ?
Si tu penses que la seconde solution est meilleure, alors je te
conseille de conserver le fonctionnement actuel ;-)
Newmagic
la commande puts arrive pourtant bien a faire la distinction
% set l {a b}
% puts $l
a b
% set l {"a" "b"}
% puts $l
"a" "b"
sinon pour mon programme, je suis d'accord avec vous,
je peux imposer un syntaxe plus stricte que tcl, est dans
ce cas mon split fait l'affaire pour le test.