在 TCL 脚本中使用变量作为数组名称(数组)

在 TCL 脚本中使用变量作为数组名称(数组)

问题是关于TCL阵列的。在我的 TCL 脚本中, variable1是从其他函数获得的变量值(值类似于PATH_xyz.) variable2是从其他计算中获得的另一个变量,其值类似于{3.5400 7.3200}

我想要:

set ${variable1}(modifyPt) {variable2}

puts ${variable1}(modifyPt)

怎样做才正确呢?

我试过

set ${variable1}(modifyPt) $variable2

输出>>>:4379.2160 13892.8270

puts ${variable1}(modifyPt)

输出>>>:PATH_62_5474(modifyPt)

(在执行时PATH_62_5474存储)我期望 的值,即在上面的第二个输出中。我也尝试过variable1PATH_62_5474(modifyPt)4379.2160 13892.8270

puts ${${xysp}(modifyPt)}

输出>>>:Error: can't read "${variable1": no such variable

答案1

我建议远离动态变量名称。您可以创建一个“复合”数组键以保持简单

# setup
set variable1 PATH_xyz
set variable2 {3.5400 7.3200}

# store the data in an array named "data"
set data($variable1,modifyPt) $variable2

# extracting it
% puts $data($variable1,modifyPt)    ; # => 3.5400 7.3200

# print the array contents
parray data    ; # => data(PATH_xyz,modifyPt) = 3.5400 7.3200

使用带有动态变量名的字典,但是从字典中提取数据看起来有点奇怪:

# store an empty dictionary in the variable "PATH_xyz"
set $variable1 [dict create]

# `dict set` takes a variable *name*
dict set $variable1 modifyPt $variable2

# `dict get` takes a variable *value*
dict get [set $variable1] modifyPt       ; # => 3.5400 7.3200

以类似的方式,您可以以同样尴尬的方式使用数组:

array set $variable1 [list modifyPt $variable2]
parray $variable1                    ; # => PATH_xyz(modifyPt) = 3.5400 7.3200
puts [set ${variable1}(modifyPt)]    ; # => 3.5400 7.3200

或者真正可怕的

puts [subst -nobackslashes -nocommands $${variable1}(modifyPt)]

答案2

我不确定我是否理解您的意思,但以下是如何间接引用 tcl 中的数组元素的一些示例:

% set array(key1) {value 1}
value 1
% set aname array
array
% set ${aname}(key2) {value 2}
value 2
% array get ${aname}
key {some value} key1 {value 1} key2 {value 2}

% set ${aname}(key2)
value 2
% set key key2
key2
% puts "<[set ${aname}($key)]>"
<value 2>

在您的示例中,您可以使用set而不是puts

% set variable2 {3.5400 7.3200}
3.5400 7.3200
% set variable1 PATH_xyz
PATH_xyz
% set ${variable1}(modifyPt) $variable2
3.5400 7.3200
% set ${variable1}(modifyPt)
3.5400 7.3200

正如上面一样,您可以在[...]命令替换中使用它:

% puts "${variable1}\(modifyPt)={[set ${variable1}(modifyPt)]}"
PATH_xyz(modifyPt)={3.5400 7.3200}

相关内容