2016-07-05 1 views
0

J'ai un problème de cotation dans Tcl. J'ai une longue liste de signaux à partir de laquelle dans une boucle for j'affecte chacun à my_sig puis l'analyser.Citation argument Tcl

foreach sig $list_of_sigs { 
    set my_sig $sig 
} 

Un exemple de ce que je nous obtenons est:

set my_sig top.sub.sig[0] 

Comment puis-je utiliser my_sig dans les commandes à suivre telles que « [ » et « ] » sont automatiquement évadés? Par exemple, mes commandes acceptent:

my_command -filter signal_bit=="top.sub.sig\[0\]" 

Merci!

+0

Est-ce que my_command est une commande tcl? Ou un exécutable? –

+0

Il s'agit d'une commande Tcl intégrée. –

+0

Cela ressemble à un outil Synopsys. L'interpréteur de Synopsys étend automatiquement [x] à "[x]", ce qui vous permet de taper les noms de bus sans les citation. Donc je suis un peu surpris que vous ayez besoin de citer le nom du signal. – Teajay

Répondre

1

Vous n'avez pas normalement de le faire, comme Tcl ne réinterprète pas le contenu des variables, sauf demande explicitement. Quelque chose augmente à nouveau la valeur et vous devriez probablement la poursuivre car elle est en fait peu sûre d'un point de vue formel, et cela tend à corréler avec le fait que le code soit lent aussi.

Cela dit, il est assez facile d'ajouter un devis avec string map. Tout ce qu'il faut, c'est un peu de soin avec la citation des barres obliques inverses.

foreach sig $list_of_sigs { 
    set my_sig [string map {[ {\[} ] {\]}} $sig] 
    # ... etc ... 
} 
+0

! Merci Donal! À votre santé –

1

Essayez

set my_sig {top.sub.sig[0]} 
my_command -filter signal_bit==$my_sig 
+0

Cela n'aide pas, malheureusement. Peut-être que je devrais affiner mon problème. top.sig.sig [0] est quelque chose que je reçois d'une autre commande que je cours dans une boucle for. En d'autres termes 'my_sig' prend seulement une valeur de la longue liste de signaux. –

+0

Vous avez probablement besoin de nous dire ce que fait "my_command" –

+0

Il est très spécifique à l'outil que j'utilise ... Je veux juste obtenir des contrôles de l'outil qui sont créés pour chaque signal ou bit. –

1

Vous pouvez utiliser une expression régulière pour échapper aux caractères spéciaux.

regsub -all {([\[\]])} $sig "\\\\\\1" sig 

Références: regsubre_syntax

+0

En fait, 'regsub -all {\ [} $ sig {\ [}' suffira car un crochet de fermeture n'est spécial que s'il y a un crochet d'ouverture non échappé. (Pour les non initiés: cela ressemble à "remplacer A par A", mais à cause de la façon dont 'regsub' interprète ses arguments, c'est en fait" remplacer A 'par A ", où A' est A après substitution.) –