[英]TCL - List with Variables
我在创建包含TCL中的文本和变量混合的列表列表时遇到麻烦。 我有一个用户输入变量,然后要将其插入列表。 为了简洁起见,我将跳过用户选择选项。
set a 0.1
set b 20.0
set c {
{text1 text2 $a text3}
{text4 text5 $b text6}
}
foreach i $c {
set CheckVal [lindex $i 2]
puts "Threshold is $CheckVal"
}
结果输出:
阈值为$ a
阈值为$ b
所需的输出:
阈值为0.1
阈值为20.0
两种选择是
set a 0.1
set b 20.0
set c {
{text1 text2 a text3}
{text4 text5 b text6}
}
foreach i $c {
set CheckVal [lindex $i 2]
puts "Threshold is [set $CheckVal]"
}
存储变量名而不是值,并在puts
调用中通过两步替换( $$Checkval
不起作用,但[set $CheckVal]
)获得值。
set a 0.1
set b 20.0
set c {
{text1 text2 $a text3}
{text4 text5 $b text6}
}
foreach i $c {
set CheckVal [lindex $i 2]
puts [subst "Threshold is $CheckVal"]
}
这是双取代而不是两步取代。 它看起来很简单,但是subst
实际上有点棘手,几乎是最后一种技巧。
不管使用哪种解决方案,这种在结构中存储对变量值的引用的方案都是易碎的,因为它取决于原始变量在范围内,并且在取消引用时仍然存在。 至少,您应该在列表中存储一个限定名称(名称空间和名称)。 如果该变量是局部变量,则需要在与存储该变量相同的调用中使用它(或使用upvar
从更高的调用堆栈开始使用,但不要去那里)。
虽然Peter Lewerin建议的方法有效,但只能作为不得已的方法。 通常,您将使用对列表进行操作的一些命令来创建列表。 我相信这就是格伦·杰克曼(glenn jackman)所暗示的。
根据您的实际代码,我可能会使用list
和/或lappend
:
set c {}
lappend c \
[list text1 text2 $a text3] \
[list text4 text5 $b text6]
然后,foreach将按您编写的方式工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.