我正在尝试在字典或数组格式上创建类似关键字 start_number last_number 的输出格式。在我的代码中,我使用了字典,代码是:
set keyword_numbers {}
set previous_keyword ""
set last_no 0
foreach item $data {
regexp {(\w+)\[(\d+)\]} $item -> keyword number
set new_keyword "$keyword $number"
puts $keyword
set key_start_end_data [dict create ]
if {$keyword == $previous_keyword} {
if { $number > $last_no } {
set last_no $number
} else {
set last_no $number
}
dict lappend key_start_end_data $keyword_data bit_end $last_no
} else {
set new_keyword $keyword
set start_no $number
set keyword_data [lindex $new_keyword 1]
dict lappend key_start_end_data $keyword_data bit_start $start_no
}
puts $key_start_end_data
set previous_keyword $keyword
}
Run Code Online (Sandbox Code Playgroud)
其中输入是,或 $data 组成
BITS_CLK2QDLY[0]
BITS_CLK2QDLY[1]
BITS_DCC_MAIN[0]
BITS_DCC_MAIN[1]
BITS_DCC_MAIN[2]
BITS_DCC_MAIN[3]
BITS_DCC_MAIN[4]
BITS_DCC_MAIN[5]
BITS_DCC_MAIN[6]
BITS_FIXDLY_MAIN[0]
BITS_FIXDLY_MAIN[1]
BITS_FIXDLY_MAIN[2]
BITS_FIXDLY_MAIN[3]
BITS_FIXDLY_MAIN[4]
BITS_FIXDLY_MAIN[5]
BITS_FIXDLY_MAIN[6]
BITS_FIXDLY_MAIN[7]
BITS_NDE_DLY[0]
BITS_NDE_DLY[1]
BITS_NDE_DLY[2]
BITS_NDE_DLY[3]
BITS_NDE_DLY[4]
BITS_NDE_DLY[5]
BITS_NDE_DLY[6]
BITS_NDE_DLY[7]
Run Code Online (Sandbox Code Playgroud)
预期输出在字典中
BITS_DCC_MAIN { bit_end: 0 bit_start: 6 }
BITS_FIXDLY_MAIN { bit_end: 0 bit_start: 7 }
BITS_NDE_DLY{ bit_end: 0 bit_start: 7 }
Run Code Online (Sandbox Code Playgroud)
或在数组中
BITS_CLK2QDLY [ 0 1 ]
BITS_DCC_MAIN [ 0 6 ]
BITS_FIXDLY_MAIN [0 7 ]
BITS_NDE_DLY[ 0 7 ]
Run Code Online (Sandbox Code Playgroud)
这就是我得到的
{} {bit_start 0}
{} {bit_end 1}
{} {bit_start 0}
{} {bit_end 1}
{} {bit_end 2}
{} {bit_end 3}
{} {bit_end 4}
{} {bit_end 5}
{} {bit_end 6}
{} {bit_start 0}
{} {bit_end 1}
{} {bit_end 2}
{} {bit_end 3}
{} {bit_end 4}
{} {bit_end 5}
{} {bit_end 6}
{} {bit_end 7}
{} {bit_start 0}
{} {bit_end 1}
{} {bit_end 2}
{} {bit_end 3}
{} {bit_end 4}
{} {bit_end 5}
{} {bit_end 6}
{} {bit_end 7}
Run Code Online (Sandbox Code Playgroud)
谁能告诉我这段代码有什么问题吗?请在评论部分提及与我的问题或澄清相关的任何疑问。
第一个问题是为输入的每一行打印一行输出。然而,据我了解您的问题描述,您的输出将与输入逐行不匹配。所以,至少最后一个puts是错的;它可能对调试有用,但对最终结果的输出没有用。
其次,将每个循环迭代重新设置key_start_end_data为空字典。也许您只想在循环之前或切换到新关键字时才执行此操作?另外,在重置它之前,您必须将其结果值复制到某个非易失性变量,但您没有使用keyword_numbers任何东西。它的目的是收集结果数据吗?
第三,这是错误的使用dict lappend。它的目的是附加到一个列表,该列表是某个字典项的值;你到处都没有这样的结构,它对这个问题没有用处。可能您想使用dict set它替换给定键的字典值,或者创建键并将其设置为值(如果不存在):
dict set key_start_end_data bit_start $number
Run Code Online (Sandbox Code Playgroud)
最后,虽然您的代码可以调试,但它太冗长并且变量太多,因此很难阅读和理解。将其与以下内容进行比较:
set keyword_numbers {}
foreach item $data {
if {[regexp {(\w+)\[(\d+)\]} $item -> keyword number]} {
if [dict exists $keyword_numbers $keyword] {
dict set keyword_numbers $keyword bit_start \
[expr {min([dict get $keyword_numbers $keyword bit_start], $number)}]
dict set keyword_numbers $keyword bit_end \
[expr {max([dict get $keyword_numbers $keyword bit_end], $number)}]
} else {
dict set keyword_numbers $keyword \
[dict create bit_start $number bit_end $number]
}
}
}
puts $keyword_numbers
Run Code Online (Sandbox Code Playgroud)
if {[regexp ...]}使其仅处理与正则表达式匹配的行。只是一个保障。然后,如果这个关键字之前已经出现过,它将用它应该考虑当前行的任何内容替换它的 bit_start 和 bit_end ;如果关键字是新的,它将重新创建它,并将两个子元素设置为当前行中的编号。此代码将成功处理更轻松的输入,例如,您可以打乱输入的行,结果仍然相同。我绕了很长的线;这不是必需的,但在这里看起来更好。
我没有处理输出线的输出。为此,puts您可以执行以下操作,而不是最后一个:
dict for {key val} $keyword_numbers {
puts "$key {$val}"
}
Run Code Online (Sandbox Code Playgroud)
它将值放入 TCL 的 dict 格式,不带冒号
| 归档时间: |
|
| 查看次数: |
456 次 |
| 最近记录: |