无法在嵌套字典中设置值

时间:2013-04-04 14:34:13

标签: data-structures dictionary tcl

我正在编写一个TCL脚本来解析Firebug分析控制台的HTML输出。首先,我只想在每个文件的基础上累积方法调用的数量。为此,我尝试使用嵌套字典。我似乎得到了第一级正确(其中文件是键,方法是值)但不是第二级嵌套级别,其中method是值,count是键。

我已阅读有关字典的更新命令,因此我可以使用此方法进行重构。我的TCL使用次数一次又一次,所以提前感谢任何帮助。下面是我的代码和一些示例输出

foreach row $table_rows {
    regexp {<a class="objectLink objectLink-profile a11yFocus ">(.+?)</a>.+?class=" ">(.+?)\(line\s(\d+)} $row -> js_method js_file file_line

    if {![dict exists $method_calls $js_file]} {
        dict set method_calls $js_file [dict create]
    }

    set file_method_calls [dict get $method_calls $js_file]

    if {![dict exists $file_method_calls $js_method]} {
        dict set file_method_calls $js_method 0
        dict set method_calls $js_file $file_method_calls
    }

    set file_method_call_counts [dict get $file_method_calls $js_method]
    dict set $file_method_calls $js_method [expr 1 + $file_method_call_counts]
    dict set method_calls $js_file $file_method_calls
}

dict for {js_file file_method_calls} $method_calls {
    puts "file: $js_file"
    dict for {method_name call_count} $file_method_calls {
        puts "$method_name: $call_count"
    }
    puts ""
}

输出:

file: localhost:50267
(?): 0
e: 0

file: Defaults.js
toDictionary: 0
(?): 0
Renderer: 0

file: jquery.cookie.js
cookie: 0
decoded: 0
(?): 0

1 个答案:

答案 0 :(得分:2)

dict set命令与Tcl中的任何setter一样,将变量的名称作为其第一个参数。我敢打赌:

dict set $file_method_calls $js_method [expr 1 + $file_method_call_counts]

应该真的读到:

dict set file_method_calls $js_method [expr {1 + $file_method_call_counts}]

(另外,为速度和安全性提供表达式。)