TCL脚本中实现关键字-起止编号映射的字典/数组代码问题排查
TCL脚本中实现关键字-起止编号映射的字典/数组代码问题排查
看起来你想要把带编号的关键字条目整理成每个关键字对应起止编号的映射,但现有代码有几个关键逻辑问题导致输出不对,咱们一步步捋清楚:
原代码的核心问题
- 字典初始化位置错误:你在
foreach循环里每次都创建新的key_start_end_data字典,这意味着每次循环都会重置,无法累积同一个关键字的起止信息,所以输出都是零散的空键条目。 - 键名获取逻辑错误:
set keyword_data [lindex $new_keyword 1]这里,new_keyword是你拼接的"$keyword $number",取索引1得到的是编号而非关键字,这直接导致字典的键变成了错误的值。 - 起止编号逻辑混乱:遇到相同关键字时,你不管当前编号比
last_no大还是小都直接赋值,而且没有正确维护起始编号(起始编号应该是第一次遇到该关键字时的编号,之后只更新结束编号为最大的那个)。 - 即时打印错误:每次循环都打印字典,导致输出碎片化,应该在所有数据处理完成后统一输出结果。
修正后的代码(字典版本)
# 初始化全局的结果字典 set keyword_numbers [dict create] set previous_keyword "" set start_no 0 set last_no 0 foreach item $data { # 匹配关键字和编号,确保编号转为整数 regexp {(\w+)\[(\d+)\]} $item -> keyword number set number [expr {int($number)}] if {$keyword eq $previous_keyword} { # 相同关键字,更新结束编号为较大值 if {$number > $last_no} { set last_no $number } # 更新字典中该关键字的结束编号 dict set keyword_numbers $keyword bit_end $last_no } else { # 新关键字,记录起始和结束编号 set start_no $number set last_no $number # 向字典中添加新条目 dict set keyword_numbers $keyword [list bit_start $start_no bit_end $last_no] # 更新上一个关键字标记 set previous_keyword $keyword } } # 循环结束后打印最终结果 puts "整理后的字典结果:" dict for {key value} $keyword_numbers { puts "$key {$value}" }
修正后的代码(数组版本)
如果你更倾向于数组格式输出,也可以这样写:
# 初始化结果数组 array set keyword_arr {} set previous_keyword "" set start_no 0 set last_no 0 foreach item $data { regexp {(\w+)\[(\d+)\]} $item -> keyword number set number [expr {int($number)}] if {$keyword eq $previous_keyword} { # 相同关键字,更新结束编号为较大值 if {$number > $last_no} { set last_no $number } set keyword_arr($keyword) [list $start_no $last_no] } else { # 新关键字,记录起止编号 set start_no $number set last_no $number set keyword_arr($keyword) [list $start_no $last_no] set previous_keyword $keyword } } # 打印数组结果 puts "整理后的数组结果:" foreach key [array names keyword_arr] { puts "$key \[ $keyword_arr($key) \]" }
预期输出
运行修正后的代码后,字典版本会输出:
BITS_CLK2QDLY {bit_start 0 bit_end 1}
BITS_DCC_MAIN {bit_start 0 bit_end 6}
BITS_FIXDLY_MAIN {bit_start 0 bit_end 7}
BITS_NDE_DLY {bit_start 0 bit_end 7}
数组版本会输出:
BITS_CLK2QDLY [ 0 1 ]
BITS_DCC_MAIN [ 0 6 ]
BITS_FIXDLY_MAIN [ 0 7 ]
BITS_NDE_DLY [ 0 7 ]
备注:内容来源于stack exchange,提问作者Santhosh Nayak D.
相关产品推荐
相关产品推荐

