Scope TCL变量访问统计

Scope TCL变量访问统计,scope,tcl,Scope,Tcl,我想做的似乎很简单,但我不知道TCL解释器是否具有此功能 我有一个tcl脚本,在其作用域内运行之前将定义数千个变量——这是由一个pre脚本完成的,该脚本只需对数千个变量执行全局操作,即可将其引入当前作用域 有没有一种简单的方法来确定在脚本中实际使用了这数千个变量中的哪一个 例如,如果脚本有变量 a、 b,c,d,e 但我想知道,无论是修改的还是刚刚使用的,都只访问了变量e。您可以使用tcl的跟踪功能来跟踪变量访问 比如: # at the end of the pre-script: arra

我想做的似乎很简单,但我不知道TCL解释器是否具有此功能

我有一个tcl脚本,在其作用域内运行之前将定义数千个变量——这是由一个pre脚本完成的,该脚本只需对数千个变量执行全局操作,即可将其引入当前作用域

有没有一种简单的方法来确定在脚本中实际使用了这数千个变量中的哪一个

例如,如果脚本有变量

a、 b,c,d,e

但我想知道,无论是修改的还是刚刚使用的,都只访问了变量e。

您可以使用tcl的跟踪功能来跟踪变量访问

比如:

# 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]
    }
}
上面的代码将在访问变量时增加相应的stats数组、读取、写入和取消设置。在脚本末尾,只需使用数组get或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]
}
然后在脚本的末尾,只需执行一个数组名称,就可以获得所有访问变量的列表。

您可以使用tcl的跟踪功能来跟踪变量访问

比如:

# 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]
    }
}
上面的代码将在访问变量时增加相应的stats数组、读取、写入和取消设置。在脚本末尾,只需使用数组get或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]
}

然后在脚本结束时,只需执行一个数组名称,就可以获得所有访问变量的列表。

使用trace add variable$var{array read write unset}track_var.@JohannesKuhn谢谢,我不知道它能做到这一点。更新了我的答案。您可能应该将变量的名称添加到回调中,否则这会给您带来一些奇怪的东西:upvar 0 foo bar;设置栏baz会告诉你变量栏已经编辑过了,不是foo。谢谢,我没意识到。迟做总比不做强。非常感谢大家,这工作完美无瑕!使用跟踪添加变量$var{array read write unset}track_var.@JohannesKuhn谢谢,我不知道它能做到这一点。更新了我的答案。您可能应该将变量的名称添加到回调中,否则这会给您带来一些奇怪的东西:upvar 0 foo bar;设置栏baz会告诉你变量栏已经编辑过了,不是foo。谢谢,我没意识到。迟做总比不做强。非常感谢大家,这工作完美无瑕!