如果我使用像" int_size [1]"在tcl数组中 - 我无法通过使用"数组获取数组键"来获取值。
array set mymap {}
set key "int_size"
set mymap($key) 100
if {[array get mymap $key] == ""} {
puts "Error: $key not found"
} else {
puts "Ok: $key found"
}
set key {int_size[1]}
set mymap($key) 100
if {[array get mymap $key] == ""} {
puts "Error: $key not found"
} else {
puts "Ok: $key found"
}
显示以下输出
Ok: int_size found
Error: int_size[1] not found
答案 0 :(得分:1)
array get
命令采用glob模式(如string match
中所述),而[
... ]
对于globbing模式是特殊的。您可以通过添加反斜杠(可能使用string map
)来解决这个问题,但它确实非常有效,没有太大的好处。
相反,使用info exists
测试值是否存在。这适用于所有键,并且(从8.5开始)非常有效。嗯,它在所有版本中都比array get
更有效,因为它在内部对整个数组进行线性扫描。
if {[info exists mymap($key)]} {
puts "OK, $key found"
} else {
puts "Error, $key absent"
}
答案 1 :(得分:0)
数组索引应该始终是一个正确的列表(实际上并没有这样记录,但它是从数组命令的语义中得出的)。由于字符串“int_size [1]”不是正确的列表,除非强制使用数组(索引)语法,否则它将不起作用。如有疑问,请在将[list ...]中的值包装到键变量之前将其包装。
<强> ETA 强>
上面的建议是正确和有用的,但这是Donal的答案是最相关的。我会提到这一点,除了经过这么多年,我似乎无法吓人。记得。该数组获取一个glob字符串。