TCL获取连接变量的值

TCL获取连接变量的值,tcl,Tcl,x是设备名称列表(设备1、设备2、设备3) 通过连接字符串端口,为每个设备1创建了一个变量,这样您就可以得到$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
是设备名称列表(设备1、设备2、设备3) 通过连接字符串端口,为每个设备1创建了一个变量,这样您就可以得到
$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}端口
包装在
expr
语句中的某个内容中。

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

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

一般来说,最好使用数组来处理这类问题。

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

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

一般来说,最好使用数组来完成这类工作。

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

upvar 0 ${x}port current_port
现在,我们有任何读取、写入或取消设置的
当前\u端口
都与使用笨拙名称的端口的读取/写入/取消设置相同,您可以简单地编写代码:

puts [expr { $current_port - 2000 }]
set current_port 12345
# etc.
别名将在当前过程结束时被遗忘


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

set x 1
set device($x,port) 12345
puts [expr {$device($x,port) - 2000}]

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

upvar 0 ${x}port current_port
现在,我们有任何读取、写入或取消设置的
当前\u端口
都与使用笨拙名称的端口的读取/写入/取消设置相同,您可以简单地编写代码:

puts [expr { $current_port - 2000 }]
set current_port 12345
# etc.
别名将在当前过程结束时被遗忘


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

set x 1
set device($x,port) 12345
puts [expr {$device($x,port) - 2000}]

也许我的设备名称示例应该更清楚。名字会有所不同,所以列表会更像这样。(hhh ggg,yyy ggg,mmm nnn)。我想你明白了这个想法:(1)去掉带有双重替换的expr,这没有帮助,(2)使用
[set$name_of_var-with-dashes-or-anything]
而不是
$$name_of_var-with-dashes-or-anything
进行变量访问。我的解决方案似乎是:set xvar[set${x}port];也许我的设备名称示例应该更清楚。名字会有所不同,所以列表会更像这样。(hhh ggg,yyy ggg,mmm nnn)。我想你明白了这个想法:(1)去掉带有双重替换的expr,这没有帮助,(2)使用
[set$name_of_var-with-dashes-or-anything]
而不是
$$name_of_var-with-dashes-or-anything
进行变量访问。我的解决方案似乎是:set xvar[set${x}port];Tcl语法的整套规则如下所示:Tcl语法的整套规则如下所示: