2016-07-05 5 views
0

私はTclで引用問題があります。私は長いループのリストを持っています。これはforループでそれぞれの単一のシグナルをmy_sigに割り当てて解析します。私は戻って何を得るのTcl引き数

foreach sig $list_of_sigs { 
    set my_sig $sig 
} 

一例:

set my_sig top.sub.sig[0] 

どのように私は、このような「[」ということにするコマンドでmy_sigを使用しないと「]」は自動的にエスケープされていますか?たとえば、私のコマンドは受け入れます:

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

ありがとう!

+0

my_commandはtclコマンドですか?または実行可能ファイルですか? –

+0

これは組み込みのTclコマンドです。 –

+0

これはSynopsysのツールのようです。シノプシスのインタプリタは自動的に[x]を "[x]"に展開し、引用符なしでバス名を入力することができます。だから私は信号名を全く引用する必要がないことにちょっと驚きました。 – Teajay

答えて

1

明示的に求められない限り、Tclは変数の内容を再解釈しないよう普段、ということを行う必要はありません。何かが再び価値を広げているのです。そして、それは実際には正式な意味では安全ではないので、おそらくそれを追うべきです。そして、それはコードが遅いことと相関する傾向があります。

つまり、string mapでの引用を追加するのはかなり簡単です。バックスラッシュの引用には少し注意が必要です。

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

それは助けと解決!ありがとうDonal!乾杯 –

1

あなたは特殊文字をエスケープするために正規表現を使用することができます

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

それは残念なことに、助けにはならない。たぶん私は自分の問題を洗練させるべきだろう。 top.sub.sig [0]は私がforループで実行する別のコマンドから得られるものです。 言い換えれば、 'my_sig'は長い信号リストから1つの値しか取ることができません。 –

+0

"my_command"とは何かを教えてください。 –

+0

これは私が使用しているツールに非常に特有のものです...私は、単一の信号またはビット毎に作成されたツールからいくつかのチェックを得たいだけです。 –

1

を試してみてください。

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

参考文献:regsubre_syntax

+0

実際には、 'regsub -all {\ [} $ sig {\ [}'で十分です。 (uninitiated:これは "AをAと置き換える"のように見えるが、 'regsub'がその引数をどのように解釈するかにより、実際には" AをAと置き換える "という代用の後にAがAである) –

関連する問題