在计算飞溅Tcl时插入var名称
这是一个相当简单的问题。为了澄清,我正在使用Tcl 8.5。 我想完成变量插值:在计算飞溅Tcl时插入var名称,tcl,eval,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的值。使用evil eval可以完成以下任务: > eval $k puts me 如何在不使用eval的情况下获得eval行为
>set p "puts me"
>puts $p
puts me
>{*}$p
me
所以这很好用。现在我想要一个字符串,它表示将$varname用于工作,但失败了
>set k {puts $p}
>{*}$k
$p
我希望Tcl输出var p的值。使用evil eval可以完成以下任务:
> eval $k
puts me
如何在不使用eval的情况下获得eval行为?
谢谢。您可以使用proc和uplevel命令来完成此操作
set me {yo yo}
set p {puts $me}
proc doit {} "uplevel 1 {$p}"
doit
您可以使用proc和uplevel命令来实现这一点
set me {yo yo}
set p {puts $me}
proc doit {} "uplevel 1 {$p}"
doit
多字值
需要替换列表中的每个项目,否则多字值将成为参数
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
单字值
使用subst进行变量替换
puts.tcl
#!/usr/bin/tclsh
set p Awesome
set k {puts $p}
{*}[subst $k]
输出:
./puts.tcl
Awesome
多字值
需要替换列表中的每个项目,否则多字值将成为参数
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
单字值
使用subst进行变量替换
puts.tcl
#!/usr/bin/tclsh
set p Awesome
set k {puts $p}
{*}[subst $k]
输出:
./puts.tcl
Awesome
eval是邪恶的吗?简短回答:不,你为什么想要没有评估的评估行为?使用eval有什么问题?在这种情况下,我会使用eval:虽然它通常很麻烦,但它是正确的工具。eval是邪恶的吗?简短回答:不,你为什么想要没有评估的评估行为?使用eval有什么问题?在这种情况下,我会使用eval:虽然它通常很麻烦,但它是正确的工具。你不需要处理这个问题:只需在当前级别:uplevel 0$pNice!我没有想到这一点。@user1455003,不,subst是非常有效的。eval和uplevel 0之间没有真正的区别。我认为eval可能会停止字节编码,从而使代码非常慢。如果我错了,那么它不是邪恶的,我是一个愚蠢的人。你不需要一个proc:只需要在当前级别:uplevel 0$pNice!我没有想到这一点。@user1455003,不,subst是非常有效的。eval和uplevel 0之间没有真正的区别。我认为eval可能会停止字节编码,从而使代码非常慢。如果我错了,那就不是坏事,我是个傻瓜。