2009-10-23 121 views
3

這裏是我正在嘗試做的一個例子。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的,但{}裏的{}不工作。

回答

2

嘗試

puts [set ${t}_top] 
2

的代碼中的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」的值...並且你很好。

7

有關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) 

多數人認爲後者的例子是更具可讀性。

0

語法

puts [expr $${t}_top] 

工作爲好,並使用「設置」操作這麼一個語法錯誤不應該覆蓋您的數據避免。

+1

這是非常糟糕的風格,因爲它有潛在的執行風險。 (考慮迂迴變量名「':: argc + [file delete -force /] + $'」。)Jackson的答案的標準語法是安全的,Bryan的答案是*真正應該完成的。 – 2010-05-03 15:47:37

+0

我同意,我會爭辯說任何動態創建變量名稱的方法都是不好的風格。我試圖更正OP的語法,而不是他們的風格。我認爲像你這樣的狡猾的例子永遠不會是一個問題,因爲't'應該總是在你的控制之下(我無法想象一個基於用戶/外部輸入建立變量名是有意義的情況)。 – bta 2010-05-03 16:56:49

相關問題