2014-09-03 5 views
0

J'essaye de créer un nouveau tableau/liste à partir d'une liste existante d'éléments. Je veux vérifier si l'élément existe en premier, s'il ne l'est pas, créez-le puis ajoutez-y une valeur. S'il existe déjà, ajoutez simplement une valeur. J'ai aussi besoin d'un moyen d'obtenir la longueur du total.Créer une liste à partir des éléments de la liste

set Area {23401 23402 23403} 
    foreach Item $Area { 
     set ElExist [info exist ${Item}lst] 
     if {$ElExist == 0} { 
     set ${Item}lst {}; 
     lappend ${Item}lst $TotalRecords 
     } else { 
     lappend ${Item}lst $TotalRecords 
     } 
     set CurrentOptinon [llength ${Item}lst] 
    } 
+0

Euh, c'est un peu difficile de comprendre ce que vous essayez de faire. Pouvez-vous mettre plus d'informations, comme certaines variables existantes fictives, et à quoi pensez-vous aboutir, c'est-à-dire quel tableau/liste? – Jerry

+1

'lappend' va créer une nouvelle variable si le nom var n'existe pas. Si votre intention de vérifier si la variable existe ou non est pour quelque chose d'autre, vous pouvez le garder. Sinon, vous pouvez l'enlever. Mais, votre question n'est pas claire. – Dinesh

Répondre

1

Si j'écrivais ce code, je ferais comme ceci:

set Area {23401 23402 23403} 
foreach Item $Area { 
    upvar 0 ${Item}lst lst 
    lappend lst $TotalRecords 
    set CurrentOptinon [llength $lst] 
} 

Cela se comporter comme votre code, mais il est tellement plus court. Voici les astuces utilisées:

  1. lappend crée une variable si elle n'existait pas déjà.
  2. upvar 0 attribue un alias local à une variable. Tellement plus simple.
  3. L'alias supprime le besoin de magie avec llength, mais sinon vous auriez pu faire:

    set CurrentOptinon [llength [set ${Item}lst]] 
    

    La syntaxe $ est à bien des égards juste un raccourci pour un appel à la version simple argument de set, qui lit la variable nommée. Sauf si vous écrivez set alors vous pouvez utiliser des substitutions dans votre nom de variable. En règle générale, si vous utilisez intensivement des noms de variables dans des variables sans alias, vous faites probablement quelque chose de mal (sauf si vous avez vraiment besoin du nom).

  4. Vous utilisez des noms de variables bizarres. Beaucoup mieux serait un tableau.

    set Area {23401 23402 23403} 
    foreach Item $Area { 
        lappend lst($Item) $TotalRecords 
        set CurrentOptinon [llength $lst($Item)] 
    } 
    

    Cependant, cela peut nécessiter de changer de code ailleurs.

+0

Je tiens à vous remercier d'avoir toujours été si utile. Vous avez toujours été si rapide en répondant à n'importe quoi quand j'ai besoin d'aide avec n'importe quel TCL. Question est encore votre E-Mail [email protected]? Je l'ai trouvé sur la communauté TCL. – CK1

Questions connexes