繁体   English   中英

TCL-包含变量的列表

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM