這裏是我正在嘗試做的一個例子。tcl:如何使用變量的值創建一個新變量
set t SNS
set ${t}_top [commands that return value]
想獲得儲存在$橫置的信息_top
puts 「${t}_top」
SNS_top (really want the data stored there?)
以爲是:$ {{$ T} _top},也許這是perl的,但{}裏的{}不工作。
這裏是我正在嘗試做的一個例子。tcl:如何使用變量的值創建一個新變量
set t SNS
set ${t}_top [commands that return value]
想獲得儲存在$橫置的信息_top
puts 「${t}_top」
SNS_top (really want the data stored there?)
以爲是:$ {{$ T} _top},也許這是perl的,但{}裏的{}不工作。
嘗試
puts [set ${t}_top]
的代碼中的Tcl的每一行是通過置換階段(其中變量,命令等被取代的)只運行一次...一般。因此,像
set var1 1
set var2 var1
set var3 $$var2
不會VAR3等於1拉閘,因爲substitutor將替換爲「$$ VAR2」,「名爲‘$ VAR2’(直譯)的變量的值」,並停止。
你需要什麼來改變事情的另一種方式,或者迫使另一輪替代。另一種方法通常是避免需要一個第二輪取代(如由傑克遜示出):
set var3 [set $var2]
在這裏,$ VAR2被替換,替換過程中,通過「VAR1」 ...然後[組VAR1]返回1 ...然後var3被設置爲「1」的值...並且你很好。
有關Tcl的一個非常有趣的事情是,您可以動態創建變量名稱,就像您在發佈的問題中所做的那樣。但是,這使得編寫代碼變得非常棘手,並且使代碼難以理解。
與其試圖弄清楚如何做$ {{$ t} _top}的等價物,完全可以避免這個問題。你可以通過使用關聯數組來做到這一點。
例如,而不是這樣的:
set t SNS
set ${t}_top [commands that return value]
...
puts [set ${t}_top]
這樣做:
set t SNS
set top($t) [commands that return value]
...
puts $top($t)
多數人認爲後者的例子是更具可讀性。
語法
puts [expr $${t}_top]
工作爲好,並使用「設置」操作這麼一個語法錯誤不應該覆蓋您的數據避免。
這是非常糟糕的風格,因爲它有潛在的執行風險。 (考慮迂迴變量名「':: argc + [file delete -force /] + $'」。)Jackson的答案的標準語法是安全的,Bryan的答案是*真正應該完成的。 – 2010-05-03 15:47:37
我同意,我會爭辯說任何動態創建變量名稱的方法都是不好的風格。我試圖更正OP的語法,而不是他們的風格。我認爲像你這樣的狡猾的例子永遠不會是一個問題,因爲't'應該總是在你的控制之下(我無法想象一個基於用戶/外部輸入建立變量名是有意義的情況)。 – bta 2010-05-03 16:56:49