2016-07-05 66 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工具。 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'只有一長串信號中的一個值。 –

+0

您可能需要告訴我們什麼是「my_command」 –

+0

這是非常具體的我正在使用的工具...我只是想從工具得到一些檢查,爲每個單一的信號或位創建。 –

1

您可以使用正則表達式來逃避特殊字符。

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

參考文獻:regsubre_syntax

+0

實際上,'regsub -all {\ [}} $ sig {\ [}''就足夠了,因爲如果沒有未轉義的左括號,右括號只是特殊的。 (對於外行人來說:這看起來像「用A代替A」,但由於「regsub」是如何解釋它的參數的,它實際上是「用A代替A」,其中A'是代替後的A)。 –