我正在尝试编写一小段代码,列出所有变量及其包含在info globals命令中的值。我已经尝试了几次替换迭代但是不能让Tcl将变量名称视为变量,并返回其值。以下是我的开始:
set fileid [open "c:/tcl variables.txt" w+]
foreach {x} [lsort [info globals]] {
set y $x
puts $fileid "$x $y "
}
我可以
DEG2RAD DEG2RAD PI PI RAD2DEG RAD2DEG .....
或
DEG2RAD $DEG2RAD PI $PI RAD2DEG $RAD2DEG .....
但我需要的是
DEG2RAD 0.017453292519943295 PI 3.1415926535897931 RAD2DEG 57.295779513082323 ....
答案 0 :(得分:4)
我认为您正在寻找subst命令:
set fileid [open "c:/tcl variables.txt" w+]
foreach {x} [lsort [info globals]] {
puts $fileid "$x [subst $$x] "
}
或者,您可以利用set返回设置值的事实:
set fileid [open "c:/tcl variables.txt" w+]
foreach {x} [lsort [info globals]] {
puts $fileid "$x [set $x] "
}
答案 1 :(得分:3)
执行此操作的最简单方法(因为它避免了使用临时变量乱丢输出)是使用帮助程序和upvar
命令:
proc listAllGlobals {filename} {
set fileid [open $filename w+]
foreach varname [lsort [info globals]] {
upvar "#0" $varname var
if {[array exists var]} continue; # Skip global arrays...
puts $fileid "$varname $var "
}
close $fileid
}
listAllGlobals "C:/tcl variables.txt"
如果你有Tcl 8.5,你可以在不创建程序的情况下这样做:
apply {{} {
set fileid [open "C:/tcl variables.txt" w+]
foreach varname [lsort [info globals]] {
upvar "#0" $varname var
if {[array exists var]} continue; # Skip global arrays...
puts $fileid "$varname $var "
}
close $fileid
}}
这一切都有效,因为upvar
所做的是将局部变量链接到另一个堆栈帧中的变量; #0
是全局堆栈帧的名称,$varname
是该上下文中变量的名称,var
是要绑定的局部变量。
答案 2 :(得分:1)
数组也是变量,仅供参考,输出所有变量(包括数组):
proc ListAllGlobals {{?pattern? *}} {
foreach {name} [lsort [info globals ${?pattern?}]] {
upvar {#0} $name var
if {[array exists var]} {
foreach {key val} [array get var] {
puts "${name}($key) [list $val]"
}
} else {
puts "$name [list $var]"
}
}
}
ListAllGlobals
ListAllGlobals tcl_platform
list
来增强值的可读性。puts $fileid [ListAllGlobals]