在TCL中替换和for循环查询

我是否可以请求帮助来理解或关注为什么我无法在以下代码中循环替换?

["/echo"   :get (conj user-intc-chain echo-intc) ] ; a "user" route
["/alive?" :get (conj api-intc-chain alive-intc) ] ; an "api" route

我希望看到

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}

即只有最后一次迭代才传递给lreplace。

如果我尝试在lreplace中索引$ data_idx,即$ data_idx($ i),则$ data_idx不是数组会出错。

如果有人能指出缺陷,将不胜感激。

谢谢。

wanlili3646 回答:在TCL中替换和for循环查询

那是因为您在每次迭代之后都创建/重写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]
}
,

使用更简单的迭代结构(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对包含列表(而不是变量的列表值)的给定变量起作用,以就地修改列表。
本文链接:https://www.f2er.com/3127551.html

大家都在问