0

x是设备名称列表 (device-1, device-2, device-3) 通过连接字符串 port 为每个 device1 创建一个变量,因此您最终得到$device-1port.

循环 x 创建

[expr $${x}port-2000 ]   #x is device-1 so it is trying $device-1port-2000 which throws error.

我想将 的数值$device-1port放入不带破折号的变量中。

set xvar $${x}port

[expr $xvar-2000 ]

或者我可以$${x}portexpr声明中包含一些东西。

4

2 回答 2

3

要读取名称中带有插值的变量,请使用单参数set

set withoutadash [set device-${x}port]

一般来说,这种事情最好使用数组。

于 2013-01-10T20:57:53.270 回答
0

使用此类复杂变量的最佳方法之一是使用该upvar命令为该变量创建一个本地“好”别名。特别是,upvar 0为局部变量创建局部别名;有点棘手,但一种已知的技术。

upvar 0 ${x}port current_port

现在,我们有任何读、写或取消设置current_port与具有笨拙名称的端口的读/写/取消设置相同,您可以简单地编写代码:

puts [expr { $current_port - 2000 }]
set current_port 12345
# etc.

在当前过程结束时将忘记别名。


当然,您可能应该考虑改用数组。它们更简单,您不需要努力使用计算变量名称:

set x 1
set device($x,port) 12345
puts [expr {$device($x,port) - 2000}]
于 2013-01-10T23:11:12.840 回答