2014-03-12 19 views
0

我是TCL編程的新手。我對花括號有困惑,回答這個問題tcl curly braces清除了我的大部分疑問。 我可以理解$var,{var}{$var},但最近我碰到另一個花括號使用,${var}。 TCL如何解釋? 我已經看到,當命名空間名稱在變量中時,在訪問名稱空間中的變量時使用了這個名稱空間。

例如:

set x myNamespace ;#myNamespace is name of namespace 
puts [set ${x}::var1] ;#var1 is variable in the namespace 

,當你不使用大括號圍繞 'X' 提示錯誤。

我也不明白{a b c}[list a b c]之間的區別,TCL解釋對這兩個命令的解釋結果有什麼區別。

詳細解釋將不勝感激。

+2

[相關](http://stackoverflow.com/q/21387543/1578604)。這個問題不是一句話,但主要的根本問題是。另外,我還在底部解釋了[最近的答案](http://stackoverflow.com/a/22332741/1578604)中的大括號。 – Jerry

回答

4

參見the manual的規則8。它允許你擁有可能被錯誤解釋的變量名。例如:

% set dotted.name 1 
1 
% puts $dotted.name 
can't read "dotted": no such variable 
% puts ${dotted.name} 
1 

請仔細閱讀第8節,因爲它實際上非常明確地解釋了所有這些。

更新回答問題編輯

在這個例子中,你提供一個變量使用命名空間名稱,你必須考慮第8條第1部分:變量名包含字母,數字,下劃線和命名空間的分隔符。這意味着x::var1是一個有效的變量名稱。因此$x::var1將嘗試取消引用x名稱空間中的var1變量。由於這不是你的意思,你必須單獨取消你的變量x。有兩種方法可以做到這一點。您可以使用set命令或美元運算符。

set x myNamespace 
puts [set ${x}::var1] 
puts [set [set x]::var1] 

兩個放語句是與示出了顯式的獨立的通以獲得x變量,然後將其代入表達式用於外set指令的值的第二個版本相當於這裏。在第一個版本中也是如此,但只是使用分組操作符將美元的效果限制爲變量名稱x

+0

但是爲什麼它在代碼中沒有使用大括號,我在問題中提到過?名稱空間名稱中沒有點。謝謝! –

+2

如果你移除了大括號,那麼你實際上正在執行'[set $ {x :: var1}]''。從某種意義上說,它與點問題相反,tcl將'::'識別爲變量名稱字符,因此將整個'x :: var1'解釋爲單個變量名稱。 – slebetman