一个非常方便的方式来表示在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