В TCL SCRIPT, как добавить словарь или массив

Я пытаюсь создать формат вывода, например ключевое слово start_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
}

где входные данные или $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]

ожидаемый результат — в словаре

      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 }

или в массиве

      BITS_CLK2QDLY [ 0 1 ]
BITS_DCC_MAIN [ 0 6 ]
BITS_FIXDLY_MAIN [0 7 ]
BITS_NDE_DLY[ 0 7 ]

это то, что я получаю

      {} {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}

Может ли кто-нибудь сказать мне, что не так с этим кодом? Пожалуйста, укажите любые сомнения, связанные с моим вопросом или разъяснением, в разделе комментариев.

1 ответ

Аналогичный подход к @Nikita, для сравнения. У Никиты лучше, если числа будут неупорядоченными.

      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 $number
        }
        dict set keyword_numbers $keyword bit_end $number
    }
}
puts [list $keyword_numbers]
      {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}}
Другие вопросы по тегам