2013-05-28 243 views
2

我有麻煩從字符串中獲取某些部分。Tcl從字符串中獲取部分

這裏是我的代碼:

set top [layout peek $::openedFiles($key) -topcell] 
    set dim [layout peek $::openedFiles($key) -bbox $top] 
# yields output "{name{x1 y1 x2 y2}}" 

    set coord [split $dim " "] 
    set x1 [lindex $coord 0] 
    set x2 [lindex $coord 2] 
    set y1 [lindex $coord 1] 
    set y2 [lindex $coord 3] 

當我調用命令set dim [layout peek $::openedFiles($key) -bbox $top],我從加載文件尺寸回來。這些尺寸是座標。輸出總是像這樣:"{name {x1 y1 x2 y2}}"

例如:{test {0 0 100 100}}

我想要得到的四個座標出字符串的,所以我可以將它們放置在一個數組。 我試圖根據空間拆分字符串,但沒有成功。 (不斷得到這個error: can't read "coord\{clock \{0 0 99960 99960\}\}": no such variable

有人有一些思想?

+0

是的迴應_really_'{test {0 0 100 100}}'?我期望它更像'{test {0 0 100 100}}',也就是一個兩元素列表,其中第二個元素本身就是一個四元素列表。 – nurdglaw

+0

@ nurdglaw對不起,負責人就像這個'{test {0 0 100}}'確實 –

+0

不用擔心,但很多編程,甚至更多的調試,包括只發現類型的細節:-) – nurdglaw

回答

4

如果您使用的是足夠新的Tcl或具有適當軟件包的舊版Tcl - 抱歉,我不記得詳細信息;讓我知道如果你要我去挖掘出來 - 那麼你可以做

set dim [layout peek $::openedFiles($key) -bbox $top] 
lassign $dim firstBit coords 
lassign $coords x1 x2 y1 y2 

使用舊版本,並沒有延長,

set dim [layout peek $::openedFiles($key) -bbox $top] 
set coords [lindex $dim 1] 
set x1 [lindex $coords 0] 

# etc. 

編輯

它原來[layout peek...]的工作原理略有不同,所以最終的工作代碼是

set dim [layout peek $::openedFiles($key) -bbok $top] 
set temp [lindex $dim 0] 
set coords [lindex $temp 1] 
set x1 [lindex $coords 0] 
set x2 [lindex $coords 1] 
set y1 [lindex $coords 2] 
set y2 [lindex $coords 3] 

OP使用Tcl8.4,沒有TclX。

很可能有餘地改善變量名,但是......

+0

爲了完整性;如果您使用Tcl 8.5或更高版本,則可以使用'lassign',對於早期版本,您需要TclX軟件包。 – nurdglaw

+0

感謝您的回答。我正在使用tcl 8.4。所以他不承認lassign命令...但是使用你的第二個答案似乎也不起作用。當我使用'puts x1'時,輸出爲空代碼:'set coords [lindex $ dim 1] set x1 [lindex $ coords 0] set y1 [lindex $ coords 1] set x2 [lindex $ coords 2] 設置Y2 [LINDEX $ COORDS 3] \t卻將$ X1 \t把$ Y1 \t把$ X2 \t把$ y2'難道我做錯了什麼? –

+0

您是否在同一次運行中查看過'dim'的值? 'coords'的價值?導致這種問題的我最喜歡的錯字是忽略一個美元符號,也許你已經設定了一個可以使空心線和x1一樣空的座標系[lindex dim 1]。 – nurdglaw

0

您可以使用正則表達式來提取所有數出該字符串的操作,然後將像往常一樣:

# Assume dim = "{test {0 0 100 100}}" 
set coord [regexp -inline -all {\d+} $dim]; # coord is now a list: "0 0 100 100" 
set x1 [lindex $coord 0] 
# set x2, y1, y2, ...