Tcl列表相关命令之lindex、linsert、lreplace、lset

  • Post author:
  • Post category:其他


lindex

lindex list ?index1 index2 ...indexN?

从列表中检索元素。 接受0到多个索引。这些索引可以在命令行中连续的给出,也可以将索引放入列表中作为一个参数给出。如果没有提供索引或者提供的是空索引列表,则返回list所有元素值。如果只提供一个单独的索引,则返回列表中该索引处的元素,如果index为负数或者大于等于列表中索引数量,则返回空字符串。单个index的解析与string index命令相同,支持简单的索引计算以及相对于列表末尾的索引计算。如果提供了多个索引,并不是返回多个索引值,而是按顺序从前一次的索引结果中再次索引。

set idx 1
set list1 {a b c {d e {f g h} i } {j k} }
lindex $list1
lindex $list1 {}
lindex $list1 0
lindex $list1 2
lindex $list1 3 2 2
lindex $list1 {3 2 2}
lindex [lindex [lindex $list1 3] 2 ] 2
lindex $list1 end
lindex $list1 end-2
lindex $list1 $idx+1
lindex $list1 $idx-5

linsert

linsert list index ?value1 value2...valueN?

将新元素插入列表。在列表的指定位置处插入所有的value,并返回新的列表。linsert不会改变原本的列表,而是生成新的列表。每个value都会做为列表的一个新的元素。如果index小于等于0,则所有新元素将会插入到列表的头部。index大于等于列表长度,则所有元素会插入到列表的尾部。与lindex一样支持string index。

set list1 {a b c {d e {f g h} i } {j k} }
puts $list1
set list2 [linsert $list1 end-1 m n {x y}]
puts $list2
puts $list1

lreplace

lreplace list first last ?value1 value2 ... valueN?

使用新元素替换指定索引范围内的旧值,并返回新的列表。first和last分别是被替换的元素的第一个和最后一个元素的索引。与lindex一样支持string index。如果只提供了索引,但是没有提供新的元素,则会删除索引范围内的元素。first与last的不同值会导致不同的行为,如下表:


first

last

行为
小于0 小于0 将新元素插入列表头部
小于0 大于等于0 替换从0到last索引处的元素
大于0 小于first 将新元素插入到first索引处
大于0 大于等于first 替换从first到last索引处的元素
大于等于列表元素数量
Tcl8.6

起,将新元素追加到列表尾部(之前版本会报错)。
set list1 {a b c d e}
lreplace $list1 -1 -2 1 2 3
lreplace $list1 -1 2 1 2 3
lreplace $list1 3 1 1 2 3
lreplace $list1 1 2 1 2 3
lreplace $list1 5 2 1 2 3
lreplace $list1 1 3

lset

lset varName ?index1 index2 ... indexN? newValue

更改列表中的元素。更改列表中指定索引处的元素。接受0到多个索引,这些索引可以在命令行中连续的给出,也可以将索引放入列表中作为一个参数给出。如果没有提供索引或者提供的是空索引列表,则会用新元素替换列表中所有的值。与lindex一样支持string index。

如果newValue中包含空格,则会将紧跟在varName后面的值当作索引解析,从而产生错误或者期望之外的结果。如果newValue为多个想要设置的值可以将newValue用花括号或双引号包围起来。如果newValue为一个值,则需要用“{“”}”将newValue包围起来。如果newValue为列表则需要用“”{}””将newValue包围起来。如果index为负或大于等于列表中的元素数量,则会发生错误。如果提供了多个索引,并不是设置多个索引的值,而是按顺序从前一次的索引结果中再次索引直至最后再进行索引值的替换,索引规则与lindex一致。

set list1 {a b}
set list2 {a b}
puts $list1
lset list1 "a b c d e"
puts $list1
lset list1 {"a b c d e"}
llength $list1
lset list1 "{a b c d e}"
llength $list1
lset list1 "a b c d e"
puts $list1
lset list2 "$list1"
llength $list2
lset list2 "{$list1}"
llength $list2
set mList { {a b c} {d e f} {g h i}}
lset mList 1 2 k
puts $mList



版权声明:本文为asty9000原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。