Si je fais
set toto "{!"
set long [llength $toto]
J'obtiens un message d'erreur car il m'interpr�te le {
Comment faire sans le remplacer pas un autre caract�re?
Y aurait il une option � mettre ou quelque chose comme �a?
Merci d'avance.
llength c'est le nombre d'éléments dans une liste, ça ne serait pas
plutôt string length $toto qui t'intéresserait ?
% set toto "{!"
% set long [string length $toto]
2
--
David Zolli
C'est plut�t du style :
set toto "titi tata {! blabla"
set long [llength $toto]
J'ai plusieurs �l�ments dans la liste, c'est pourquoi j'utilise llength.
La liste est remplit de fa�ons al�atoire.
D�s que les �l�ment comportent des trucs style { ou . tcl me les
interpr�te et fais planter
Kroc a �crit :
> On 4 sep, 01:24, User <u...@user.invalid> wrote:
>
>> Bonjour,
>>
>> Si je fais
>> set toto "{!"
>> set long [llength $toto]
>>
>
> llength c'est le nombre d'�l�ments dans une liste, �a ne serait pas
> plut�t string length $toto qui t'int�resserait ?
User said on 06/09/2009 23:46:
> set toto "titi tata {! blabla"
> set long [llength $toto]
>
> D�s que les �l�ment comportent des trucs style { ou . tcl me les
> interpr�te et fais planter
set long [llength [split $toto]]
me para�t convenir � premi�re vue.
HTH
Francois
Ou bien backslasher les caractères { } [ ] " et .
Newmagic
Le problème vient du fait que tu ne fais pas la distinction entre une
chaîne et une liste. Quoique chaque liste soit une chaîne (ou plus
précisément, que chaque liste ait une représentation chaîne valide),
il existe des chaînes qui ne sont pas des listes valides, comme tu l'a
découvert. Il est important de ne jamais présumer qu'une chaîne soit
une liste valide. Si tu construis ta valuer avec des commandes qui
font des listes ([list], [lappend], etc.), il n'y a aucun problème.
Sinon, depuis 8.5 (si je ne me trompe pas) il existe la commande
[string is list] qui pourrait t'être utile. S'il faut faire une
conversion, la méthode à utiliser dépend des circonstances; [split] et
[regexp -all -inline] sont deux options, et il doit y en avoir
d'autres.
Cordialement,
Aric
#############################
% set toto \{
{
% lappend toto titi
unmatched open brace in list
Le backslash neutralise l'accolade et toto est donc une chaine de
caractère constituée uniquement de {
On ne peut pas construire de liste.
###############################
% set toto titi
titi
% lappend toto \{
titi \{
la chaine de caractère toto est bien constituée de titi et de \{
de plus lappend est une commande pour manipuler des listes donc toto
est bien une liste valide
%lindex $toto 1
{
Là c'est bizarre, car le backslash est ignoré
% lappend toto a
unmatched open brace in list
et on retombe sur une tentative de créer une liste titi { ce qui est
impossible.
###########################
A+
Hubert
Bonjour,
Je pense que le phénomène que vous décrivez ici représente les limites
de la normalisation des listes en Tcl/Tk. En effet, comme "tout est
chaîne de caractère", représenter une liste sous forme de chaîne de
caractères entraîne obligatoirement l'utilisation de caractères
spécifiques de séparation qui ne peuvent être inclus dans l'un des
éléments de la liste elle-même, à moins d'être backslashés.
Or, l'interprétation d'un tel élément (pour un affichage ou dans le
corps d'une méthode comme lappend, apparemment) entraîne la
"disparition" du backslash, ce qui débouche sur des erreurs du type de
celles rencontrées dans votre exemple.
Mais je peux me tromper...
Newmagic
#############################
% set toto \{
{
% lappend toto titi
unmatched open brace in list
Le backslash neutralise l'accolade et toto est donc une chaine de
caract�re constitu�e uniquement de {
On ne peut pas construire de liste.
###############################
% set toto titi
titi
% lappend toto \{
titi \{
la chaine de caract�re toto est bien constitu�e de titi et de \{
de plus lappend est une commande pour manipuler des listes donc toto
est bien une liste valide
%lindex $toto 1
{
L� c'est bizarre, car le backslash est ignor�
% lappend toto a
unmatched open brace in list
et on retombe sur une tentative de cr�er une liste titi { ce qui est
impossible.
###########################
A+
Hubert
en faisant comme �a c'est OK
1% set toto titi
titi
2% lappend toto \\{
titi {\{}
3% lindex $toto 1
\{
4% lappend toto a
titi {\{} a
5%
bonne journ�e Michel
Proust Michel a �crit :
> % set toto titi
> titi
> % lappend toto \{
> titi \{
> la chaine de caract�re toto est bien constitu�e de titi et de \{
> de plus lappend est une commande pour manipuler des listes donc toto
> est bien une liste valide
Petite tentative pedagogique, en suggerant de bien faire la distinction
entre ce qui est "parse", ce qui est represente en interne dans l'objet
Tcl, et ce qui est affiche. La chronologie est importante.
Quand vous ecrivez
% lappend toto \{
c'est le parser qui traite le backslash pour echapper le caractere
suivant "{". La fonction lappend recoit donc deux argument, le nom de la
liste "toto" et la chaine de 1 caractere "{". Il n'y a plus de
"backslash" ici. Le resultat est donc une liste de deux elements, le
premier "titi", le deuxieme "{" (chaine de 1 caractere).
Vient alors le moment de retourner le resultat pour l'afficher.
L'interprete doit alors generer alors une representation sous forme de
chaine de la liste en question (tout en conservant en memoire que cet
objet est une liste). Et c'est lui qui ajoute un backslash pour
l'affichage, car sinon la chaine "titi {" ne serait pas la forme
serialisee de la liste. Ce backslash n'est pas celui que vous avez saisi
en entree et qui aurait ete propage, juste un autre requis pour
l'affichage. Pour illustrer cela, vous pouvez tester:
% set toto titi
titi
% lappend toto "{"
titi \{
Aucun backslash en entree, mais l'afficheur doit en mettre un pour
representer sous forme de chaine le contenu de la liste.
> %lindex $toto 1
> {
> L� c'est bizarre, car le backslash est ignor�
J'espere que vous voyez donc maintenant que ceci n'est pas bizarre. Le
deuxieme element de la liste toto est bien la chaine de 1 caractere "{".
Et l'afficheur, a qui il est demande d'afficher la forme serialisee
d'une chaine, n'a rien a faire si ce n'est l'afficher, sans autre
precaution. Dans le meme genre, vous pouvez faire:
% set toto [list titi "hello world"]
titi {hello world}
% lindex toto 1
hello world
> % lappend toto a
> unmatched open brace in list
> et on retombe sur une tentative de cr�er une liste titi { ce qui est
> impossible.
La, vous avez du faire une erreur de frappe ou qqchose qui n'est pas
dans votre session, car ca ne pose pas de probleme:
% set toto titi
titi
% lappend toto \{
titi \{
% lappend toto a
titi \{ a
Eric