在评估splatter Tcl时插入var var name

时间:2014-12-19 14:58:54

标签: tcl eval

这是一个相当简单的问题。为了澄清,我正在工作Tcl 8.5 我想完成变量插值:

>set p "puts me"
>puts $p
puts me
>{*}$p
me

所以这很好用。现在我想要一个字符串,表示将$ varname置于工作状态,然后失败。

>set k {puts $p}
>{*}$k
$p

我希望Tcl输出var p的值。使用“邪恶的评估”完成它:

> eval $k
puts me

如何使用eval获得eval行为? 感谢。

2 个答案:

答案 0 :(得分:4)

多字值

需要替换列表中的每个项目,否则多字词值将成为参数。

set p {What is Awesome?}
set k {puts $p}
set len [llength $k]

# Must subst each item in the list in order
# to execute k properly.
for {set i 0} {$i < $len} {incr i} {
        lset k $i [subst [lindex $k $i]]
}
{*}$k

输出:

./puts.tcl
What is Awesome?

单字值

使用subst进行变量替换。

puts.tcl

#!/usr/bin/tclsh

set p Awesome
set k {puts $p}
{*}[subst $k]

输出:

./puts.tcl
Awesome

答案 1 :(得分:0)

您可以使用proc和uplevel命令执行此操作。

set me {yo yo}
set p {puts $me}

proc doit {} "uplevel 1 {$p}"

doit