Lreplace и для цикла запроса в TCL - PullRequest
0 голосов
/ 11 ноября 2019

Могу ли я попросить помощи, чтобы понять или выделить, почему я не могу зациклить lreplace в следующем коде

oldlist = {} {} {} {} {} {} {} {} {} {Fred 1}
data_idx = 0 3 6
data_len = 3

for {set i 0} {$i < $data_len} {incr i} {
set idx_Fname [lindex $data_idx $i]
puts "ids($i) = $idx_Fname"
set NewList [lreplace $oldlist $data_idx $data_idx foo]
}

Я бы ожидал увидеть

NewList = foo {} {} foo {} {} foo {} {} {Fred 1}

Вместо этого я вижу

NewList = {} {} {} {} {} {} foo {} {} {Fred 1}

то есть только lreplace передается только последняя итерация.

, если я пытаюсь индексировать $ data_idx внутри lreplace, т.е. $ data_idx ($ i), есть ошибка для $ data_idx, а не длямассив.

Был бы признателен, если бы кто-то мог указать на недостаток.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 11 ноября 2019

Это потому, что вы создаете / переписываете переменную NewList после каждой итерации. Таким образом, после первой итерации переменная NewList содержит:

NewList = foo {} {} {} {} {} {} {} {} {Fred 1}

, после второй она содержит:

NewList = {} {} {} foo {} {} {} {} {} {Fred 1}

, а после третьей она содержит:

NewList = {} {} {} {} {} {} foo {} {} {Fred 1}

Я думаю, вы бы имели в виду что-то вроде этого:

set NewList $oldlist
for {set i 0} {$i < $data_len} {incr i} {
    set idx_Fname [lindex $data_idx $i]
    puts "ids($i) = $idx_Fname"
    set NewList [lreplace $NewList $data_idx $data_idx foo]
}
1 голос
/ 11 ноября 2019

Вы можете легко свести ваш пример к нескольким строкам, используя более простую итерационную конструкцию (foreach) и используя lset.

set oldlist [list {} {} {} {} {} {} {} {} {} {Fred 1}]
set data_idx [list 0 3 6]

foreach idx $data_idx {
    lset oldlist $idx foo
}
puts $oldlist
  • foreach не требует, чтобы вы поддерживали переменную счетчика.
  • lset работает с заданной переменной, содержащей список, а не значение списка, для изменения списка на месте.
...