1

我有以下问题:

set start "input[0]"
set end   "output[0]"
set myArray($start,$end,pin) 1
set x "input[0]"
set y "output[0]"
set test [array names myArray $x,$y,pin]
puts "\n$test"

输出应该是:

input[0],output[0]

但输出是:

{}

如果我做:

set test [array names myArray *,*,pin]
puts "\n$test"

输出是:

input[0],output[0]

另外,如果我用原始代码替换[]{} ie.input{0},output{0} 话。

有人可以告诉我这里发生了什么吗?如何逃脱[]括号?

4

1 回答 1

3

好吧,让我们看看这里发生了什么:

set start "input[0]"

这将执行命令0。我不知道那是做什么的,但你可能不想要那样。\使用或使用转义括号{}将名称括起来。

同样适用于

set end   "output[0]"
# ...
set x "input[0]"
set y "output[0]"

但看起来你没有这个问题。

接下来是您将 glob 模式传递给array names

set test [array names myArray $x,$y,pin]

Tcl[]在 glob 模式中使用字符选择,类似于正则表达式。所以你的模式只会匹配input0,output0,pin。您可以通过将-exact开关传递给来避免这种情况array names

set test [array names myArray -exact $x,$y,pin]

或者您可以使用反斜杠再次转义括号(请注意,模式应该看起来像Tcl 进行各种替换input\[0\],input\[1\],pin 之后的样子。)

于 2013-12-19T13:19:29.340 回答