2010-04-06 10 views
2

J'essaie de remplacer la valeur de variable dans la matrice pour mettre à jour les valeurs de matrice en fonction des entrées de ligne de commande. par exemple. Je reçois l'adresse IP comme argument de ligne de commande pour mon script TCL et essaye de mettre à jour les commandes avec la valeur IP de recvd.Mise à jour des valeurs de tableau TCL en fonction de l'argument de la ligne de commande

Mon tableau est:

array set myArr { 1 myCmd1("192.268.2.1","abc.txt") 
        2 myCmd2("192.268.2.1","xyz.txt") 
        3 myCmd3("192.268.2.1","klm.txt") 
       } 

Ici, "192.268.2.1" sera effectivement fourni comme argument de ligne de commande.

J'ai essayé de faire

array set myArr { 1 myCmd1($myIP,"abc.txt") 
        2 myCmd2($myIP,"xyz.txt") 
        3 myCmd3($myIP,"klm.txt") 
       } 

et d'autres combinaisons comme ${myIP}, {[set $myIP]} mais personne ne travaille.

Merci d'avance pour toute aide/intrants.

Répondre

-1

essayer:

array set myArr [list myCmd1($myIP, "abc.txt") 2 myCmd2($myIP, "xyz.txt") ... ] 

Pourquoi? Parce que lorsque vous écrivez {$var} dans Tcl, cela signifie $var et non le contenu de la variable var. Si vous utilisez list pour créer la liste au lieu des accolades, les variables sont toujours évaluées.

+1

C'est plus un peu cassé. Les bits quotés '" abc.txt "' ont un espace avant (plusieurs éléments?) Et un caractère après (erreur d'analyse!). –

3

Utilisez la commande list

% set myIP 0.0.0.0 
0.0.0.0 
% array set myArr [list 1 myCmd1($myIP,"abc.txt") 2 myCmd2($myIP,"xyz.txt") 3 myCmd3($myIP,"klm.txt")] 
% puts $myArr(1) 
myCmd1(0.0.0.0,"abc.txt") 
% puts $myArr(3) 
myCmd3(0.0.0.0,"klm.txt") 
% 
1

Je pense que votre code sera plus facile à comprendre et plus facile à maintenir si vous ne tentez pas d'utiliser le tableau défini dans cette instance. Vous pouvez vous en sortir si vous faites attention (voir les réponses relatives à l'utilisation de la liste) mais il n'y a vraiment aucune raison de le faire quand une solution plus lisible existe.

Voici ma solution:

set myArr(1) "myCmd1($myIP,\"abc.txt\")" 
set myArr(2) "myCmd2($myIP,\"xyz.txt\")" 
set myArr(3) "myCmd3($myIP,\"klm.txt\")"