2013-12-19 81 views
1

我有以下問題:方括號在Tcl數組

set start "input[0]" 
set end "output[0]" 
set myArray($start,$end,pin) 1 
set x "input[0]" 
set y "output[0]" 
set test [array names myArray $x,$y,pin] 
puts "\n$test" 

輸出應該是:

input[0],output[0] 

但輸出:

{} 

如果我這樣做:

set test [array names myArray *,*,pin] 
puts "\n$test" 

輸出爲:

input[0],output[0] 

另外,如果我通過{}ie.input{0},output{0} 原代碼的工作取代[]

有人可以告訴我這裏發生了什麼嗎?我如何逃避[]括號?

回答

3

好吧,讓我們來看看這到底是怎麼回事:

set start "input[0]" 

這將執行該命令0。我不知道那是幹什麼的,但你可以不要這樣做。使用\或使用{}將括號括起來。

同樣適用於

​​

但它並不像你有這個問題。

接下來的事情是,你傳遞一個水珠圖案array names

set test [array names myArray $x,$y,pin] 

TCL在glob模式使用[]字符的選擇,simmilar到正則表達式。所以你的模式只能匹配input0,output0,pin。您可以通過將-exact開關array names避免:(注意模式應該像input\[0\],input\[1\],pin後的Tcl做了各種各樣的替代)

set test [array names myArray -exact $x,$y,pin] 

或者你可以用反斜槓再次逃脫括號

+0

這適用於上面提到的情況。 我有另一種情況下,我不能使用-exact: '設置測試[數組名myarray的$ X,$ Y *,長度]' 的-exact選項失敗,在這裏顯而易見的原因。我無法解決$ x和$ y中的方括號和* using -regexp問題。任何關於這裏發生的事情的想法? – user3119236

+1

@ user3119236爲什麼你一直在使用'array names'?在我看來,你正在做一些錯誤的事情,而且你需要退後一步,想一想你想要做什麼。也許在數組元素中放置一個字典會更合適,或者可能將某些東西映射爲某種對象? –

+0

Us字符串映射在所有方括號出現之前用斜線表示: set checkname [string map {\ [\\\ [\] \\\]}「$ x,$ y,*,length」] set test [array名稱myArray $ checkname] – mkostya