Fish Shell数组追加元素问题:set命令为何未添加新元素?
解决Tcl中数组/列表元素追加的问题
嘿,我明白你遇到的麻烦了!你现在的代码之所以会把所有内容拼成单个变量,是因为没搞对Tcl里集合操作的正确姿势,我来给你拆解一下问题和解决办法:
问题出在哪?
你写的set children $children $line[$i]在Tcl里会被当成「把$children、空格、$line[$i]的内容拼接成一个新字符串,赋值给children」,而不是向数组/列表里追加独立元素。另外还有个语法小坑:Tcl里关联数组的索引是用()而不是[],$line[$i]的写法是错误的,会导致意外的解析行为。
分两种情况解决:
情况1:你想维护一个线性列表(按顺序存元素的集合)
用Tcl专门的lappend命令,它会自动把元素追加到列表末尾,还能正确处理元素间的分隔:
# 先初始化空列表(如果还没初始化的话) set children [list] # 循环追加元素,注意列表取元素用lindex,数组用() for {set i 1} {$i <= 10} {incr i} { # 如果line是列表,用lindex取第i个元素;如果line是数组,用$line($i) lappend children [lindex $line $i] # 或者如果line是关联数组:lappend children $line($i) }
情况2:你想维护一个关联数组(键值对结构)
那需要给每个新元素指定键(比如用循环的i作为键),直接赋值对应的键即可:
# 循环给数组添加键值对 for {set i 1} {$i <= 10} {incr i} { set children($i) $line($i) }
这样每个$line($i)的值会被存在children数组的$i这个键下,每个元素都是独立的。
内容的提问来源于stack exchange,提问作者Adham Zahran
相关产品推荐
相关产品推荐

