我想做的看起来很简单,但是不知道TCL解释器有没有这个功能。
我有一个 tcl 脚本,它将在其范围内运行之前定义数千个变量——这是通过一个预脚本完成的,该脚本简单地对数千个变量执行“全局”以将其带入当前范围。
有没有一种简单的方法可以确定在该脚本中实际使用了这数千个变量中的哪一个?
例如,如果脚本有变量
a,b,c,d,e,
但只有变量 e 被访问(无论是修改还是刚刚使用),我想知道。
您可以使用 tcl 的trace
功能来跟踪变量访问。
就像是:
# at the end of the pre-script:
array set var_stats {}
proc track_var {varname n1 n2 op} {
global var_stats
incr var_stats($varname.$op)
}
foreach var $list_of_varnames {
foreach op {array read write unset} {
set var_stats($var.$op) 0
trace add variable $var $op [list track_var $var]
}
}
上面的代码将在访问变量时增加相应的统计信息(数组、读取、写入和取消设置)。在脚本结束时,只需使用 aarray get
或 a转储数组parray
。
我只是重读了您的问题并意识到如果您只想知道访问了哪个变量,那么有一种更简单的方法可以做到:
array set var_stats {}
proc track_var {varname n1 n2 op} {
global var_stats
set var_stats($varname) 1
}
foreach var $list_of_varnames {
trace add variable $var {array read write unset} [list track_var $var]
}
然后在脚本的最后只做一个array names
获取所有访问变量的列表。