tcl数组键,元字符不起作用

时间:2016-12-22 06:28:45

标签: tcl

如果我使用像" 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

2 个答案:

答案 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字符串。