tcl使用列表来处理各种集合,列表允许你把任意数量的值集合在一起,把集合作为一个实体传递,列表是元素的有序集合,各个元素可以有任何的字符串。
最简单法的列表就是包含由任意个空格、制表符、换行符分割开的任意多个元素的字符串
例如:Joe anne mary jim
就是一个有4个元素的列表。一个列表中可以有任意多个元素,每一个元素可以是任意的字符串。
1、lindex命令,用来从一个列表中取得元素
格式:lindex list ?index ...?
命令: lindex {Joe anne mary jim} 1
结果: anne
lindex至少要有两个参数,即一个列表 和一个索引值,注意:对所有列表命令,索引0都对应列表的第一个元素,索引1对应第二个元素;索引end对应列表中的最后一个元素,如果索引指向的位置超出了列表,lindex会返回空字符串。
2、llength命令,用来返回列表中元素的个数
格式:llength list
例如:llength {a b c d}
=>4
大括号常用于在列表中的嵌套,如下:
lindex {a b {c d e} f} 2
=>c d e
在操作嵌套列表时,lindex命令允许你指定一个或多个索引值,可以是分别独立的参数,也可以是一个列表,通过多个索引值可以从子列表中取得元素,例如:
set elements {{a b} {c {d e f}} g}
lindex $elements 1 1 2
=>f
lindex $elements {0 0}
=>a
3、创建列表,Tcl里可以用list concat或 lrepeat 这三个命令来创建列表
3.1 list命令,把它的参数加入列表,即每个参数作为列表的一个独立元素,例如:
list {a b c} {d e} {f {g h j}}
=>{a b c} {d e} {f {g h j}}
3.2 concat命令,把参数列表中的所有元素串接为一个大的列表。如果某个输入列表的某个元素是嵌套的列表,这个元素会保持嵌套的列表。
concat {a b c} {d e} {f {g h j}}
=>a b c d e f {g h j}
3.3 lrepeat命令,重复一个元素集合来创建列表,集合中各个元素作为单独参数给出,而第一个参数是指定重复的次数。例如:
lrepeat 3 a b c
=>a b c a b c a b c
4、修改列表命令:lrange linset lreplace lset lappend
4.1 lrange命令,返回列表中某范围内的命令,该命令需要获取的参数包括一个列表和两个索引值,返回的列表是这两个索引值对应的元素之间的所有元素组成的新列表(当然也包括这两个索引值对应的元素)。
set x {a b {c d e}}
=>a b {c d e}
lrange $x 1 2
=>b {c d e}
lrange $x 1 2
=>a b {c d e}
4.2 linset 命令,把一个或多个元素插入已经存在的列表,从而形成新的列表,linsert 需要获取三个或更多参数,第一个参数是列表,第二个参数是列表中的第一元素所对应的索引值,第三个以及其它参数是将要插入这个列表的新元素。linsert的返回值是一个列表。
set x {a b {c d e}}
=>a b {c d e}
linsert $x 2 x y z
=>a b x y z {c d e}
linsert $x 0 x y z
=>x y z a b {c d e}
4.3 lreplace 命令,用来从列表中删除命令,且可以在它们的位置添加新的元素。它需要三个或更多参数,第一个参数是列表,第二个参数和第三个参数给出了要删除的那部分元素的开头元素和结尾元素分别对应的索引值,如果只给定了三个参数,那么就是从原列表中删除指定的那部分元素得到新的列表
lreplace {a b {c d e} e} 3 3
=>a b {c d e}
如果lreplace指定了更多的参数,如下面的例子,那这些参数就会插入到被删除的元素的位置
lreplace {a b {c d e} e} 3 3 {x y} z q
=>a b {c d e} {x y} z q
4.4 lset 命令,是一种快速简练地修改元素值的方法,它获取变量名,列表中已经存在的一个元素对应的索引或一系列索引从而指向某个子列表的元素,以及赋给这个元素的新值。lset命令只能用来修改已经存在的列表,不能用来创建列表。
set person {{jane doe} female 30}
=>{jane doe} female 30
lset person 2 25
=>{jane doe} female 25
lset person 0 0 mary
=>{mary doe} female 25
4.5 lappend命令,用来把新的元素添加存放在一个变量中的列表里,它需要获取一个存放列表的变量名作为参数,以及任意多个其它参数,这些参数作为元素添加到第一个参数指明的列表中,lappend会返回该变量列表的新值。
set x {a b {c d} e}
=>a b {c d} e
lappend x x XX {YY ZZ}
=>a b {c d} e x XX {YY ZZ}
puts $x
=>a b {c d} e x XX {YY ZZ}
5 lassign 命令,把列表中的值分发到一个或多个变量中,它的第一个参数是一个列表,后面是参数的变量名。lassign把列表中的元素依次分发到这些变量中,如果变量名比列表中的元素多,多余的变量会被设置为空字符串,如果列表中的元素比变量个数多,则会返回一个由未分发的元素组成的列表。
lassign {a b c} x y z
puts "$x $y $z"
=>a b c
lassign {d e} x y z
puts "<$x> <$y> <$z>"
=><d> <e> <>
puts "$x $y $z"
=>d e
lassign {d e f g h} x y
=>f g h
puts "$x $y "
=>d e