Tcl能否不使用临时变量直接lappend数组内嵌套列表的元素
解答
完全可以不使用临时变量x实现相同执行结果。lappend无法直接作用于嵌套元素的核心原因:lappend的第一个入参必须是变量名,命令逻辑是原地修改变量中存储的列表值,无法对脱离变量的纯值做修改。你尝试写的[lindex comPorts($sock) 4]本身存在语法疏漏:Tcl中取数组元素值必须加$前缀,就算补全为[lindex $comPorts($sock) 4],拿到的也只是对应位置存储的具体值,不是可被lappend操作的变量引用,自然无法生效。
无临时变量实现代码
直接通过lset结合展开运算符一步完成赋值即可,不需要中间变量:
set sock abc set comPorts($sock) [list $sock 0 0 1 {129} {} {} {} ] set data {134 135} chan puts stdout [lindex $comPorts($sock) 4] # => 129 # 单步完成嵌套列表元素追加,无临时变量 chan puts stdout [lset comPorts($sock) 4 [list {*}[lindex $comPorts($sock) 4] {*}$data]] # => abc 0 0 1 {129 134 135} {} {} {}
如果使用8.6及以上版本的Tcl,也可以用linsert完成子列表拼接,效果一致:
lset comPorts($sock) 4 [linsert $data 0 {*}[lindex $comPorts($sock) 4]]
实现逻辑
lset原生支持直接传入数组变量名+多层索引路径修改嵌套位置的值,不需要提前取出外层列表存入临时变量- 子列表追加的本质是生成「原有子列表元素+新增元素」的新列表,通过
{*}展开运算符将原有子列表和新增数据的元素铺平,拼接为新的子列表后直接传给lset赋值到对应索引即可,全程不需要中间变量暂存值。
内容的提问来源于stack exchange,提问作者Gary
相关产品推荐
相关产品推荐

