一個非常方便的方式來表示在TCL的表
迭代是通過簡單的陣列。這裏有一個例子:
array set xy {}
foreach i {1 2 3} {
foreach j {10 20 30} {
set xy($i,$j) [expr $i + $j]
}
}
現在xy
是一個數組,其鍵看起來像表的索引。在這裏:
% array names xy
3,10 2,20 1,30 3,20 2,30 3,30 1,10 2,10 1,20
或者更明確:
% foreach k [array names xy] {puts $k}
3,10
2,20
1,30
3,20
2,30
3,30
1,10
2,10
1,20
下面是如何訪問它們:
% puts $xy(3,10)
13
的3,10
括號內是一個字符串!該數組返回與上面的循環中關聯的字符串關聯的值。 (因此逗號後面不能有空格)。
這很容易,如果索引變量提供給訪問值:
% set x 3
3
% set y 10
10
% puts $x,$y
3,10
最後的命令等同於明確的引號:
% puts "$x,$y"
3,10
這裏是我們如何可以訪問陣列在該密鑰處的元素:
% puts $xy($x,$y)
13
並且如果密鑰不存在:
% puts $xy(4,10)
can't read "xy(4,10)": no such element in array
讓我們打印數組的鍵和值的結論:
% foreach k [array names xy] {puts "$k: $xy($k)"}
3,10: 13
2,20: 22
1,30: 31
3,20: 23
2,30: 32
3,30: 33
1,10: 11
2,10: 12
1,20: 21
ADDED
現在,假設你有y
和z
值,你如何找到了x
?
set y 20
set z 23
使用一切的特殊,強大的TCL屬性是一個字符串:
在這裏,我們找到的所有鍵和值匹配的鑰匙圖案*,20
:
set results [array get xy *,$y]
讓我們來看看:
puts $results
% 2,20 22 3,20 23 1,20 21
我們得到了3對的列表,每個對包含關鍵字和值。
現在讓我們提取對應於輸入$z
的鍵/值。我們將利用強大regexp
Tcl命令,看到$results
現在作爲一個字符串,而不是一個列表:
regexp "(\\d+),($y) ($z)" $results whole x1 y1 z1
現在x1
,y1
,z1
容納所有的信息,我們希望:
puts "$x1 $y1 $z1"
% 3 20 23
嗨,彼得,謝謝。這部分工作,因爲它拿起正確的數據集。但是在所需數據之前和之後追加零。最後一步是取0.9和1.1之間的數據和平均值。我使用Join&llenght來平均,但所有的零都沒有得到正確的平均值。 – Anju
@Anju:更新了答案。 –
感謝彼得,我在發送消息之前曾試過,但仍然有前導零,但是尾隨零被刪除。現在只需要設法防止空變量 – Anju