2009-05-12 7 views
3

J'ai besoin d'utiliser la valeur d'une variable dans une autre variable.Dans TCL, Comment faire une variable utiliser la valeur d'une autre variable

C'est ce que j'ai essayé ..

set cmd_ts "foo bar" 
set confCmds { 
    command1 
    command2 
    $cmd_ts 
} 
puts "confCmds = $confCmds" 

Mais au lieu d'obtenir

confCmds = 
    command1 
    command2 
    foo bar 

Je reçois:

confCmds = 
    command1 
    command2 
    $cmd_ts 

post-scriptum J'ai essayé les éléments suivants en vain

  1. $ cmd_ts
  2. "$ cmd_ts"
  3. {$ cmd_ts}
  4. $ \ cmd_ts

Répondre

9

(presque) rien ne fonctionnera aussi longtemps que vous utilisez des accolades. La meilleure suggestion est d'utiliser la commande list:

set confCmds [list command1 command2 $cmd_ts] 

Je dis (presque) parce que vous pouvez utiliser subst pour effectuer la substitution variable sur confCmds, mais ce n'est pas vraiment ce que vous voulez et qui est semée d'embûches. Ce que vous voulez, c'est une liste de mots, dont un ou plusieurs peuvent être définis par une variable. C'est précisément ce que la solution ci-dessus vous donne.

Si vous voulez, vous pouvez répartir les commandes sur plus d'une ligne en utilisant la barre oblique inverse:

set confCmds [list \ 
    command1 \ 
    command2 \ 
    $cmd_ts \ 
] 

Cette solution suppose que ce que vous voulez une liste de tcl. Cela peut ou peut ne pas être ce que vous voulez, tout dépend de la façon dont vous traitez ces données en aval.

Dans un commentaire que vous avez écrit que ce que vous voulez vraiment est une chaîne d'éléments séparés saut de ligne, dans ce cas, vous pouvez simplement utiliser des guillemets doubles, par exemple:

set confCmds " 
    command1 
    command2 
    $cmd_ts 
" 

Cela vous donnera une chaîne plusieurs lignes séparées par des retours à la ligne. Faites attention d'essayer de traiter ceci comme une liste de commandes (ie: ne faites pas 'foreach foo $ confCmds') car cela peut échouer selon ce qui est dans $ cmd_ts.

+0

en fait, je veux commande1, commande2 et cmd_ts $ à être séparés par un nouveau ligne, mais en utilisant la liste ou la concaténation je les rassemble comme une chaîne délimitée par un espace.Toute idée de comment y arriver car je suis confronté à un temps difficile à affronter. \ N: P –

+2

Dans votre exemple original, vous pouvez utiliser des guillemets au lieu d'accolades. Tant que vous ne traiterez pas ces données en tant que liste Tcl, tout ira bien. Une autre option consiste à convertir la liste tcl que vous venez de créer en une chaîne d'éléments séparés par un saut de ligne avec [join $ confCmds \ n] –

4

La réponse de Bryan est bonne, à part une faute de frappe que je ne peux pas résoudre avec mon représentant. (la liste de la première commande doit être terminée par un crochet).

Si vous voulez faire quelque chose d'utile avec les commandes, vous voulez probablement eux comme une liste, mais si vous voulez juste séparés par une nouvelle ligne faire à la fin:

set confCmds [join $confCmds "\n"] 
+0

merci de signaler la faute de frappe. Je l'ai réparé. –

2

Si vous devez ont la liste définie comme vous l'avez, vous pouvez également utiliser la commande subst, qui effectuera la substitution que les accolades empêchent:

subst $confCmds 
Questions connexes