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语法的整套规则如下所示: