列表操作在脚本中使用的频率非常高,基本上每个脚本都会涉及到其中的一些操作,在这里对列表的命令进行实例解析,以加深对列表命令的理解,本文涉及的命令为lappend、lreplace、lset、linsert、lsort和lreverse。
lappend
varName ?
value value value ...?
在列表后面添加元素,常用的命令,lappend命令接收一个变量名(这里需要注意,必须是变量名而不是变量),将元素添加到变量后面,变量会被修改:
% set myList {This is a}
This is a
% lappend myList tcltk example
This is a tcltk example
% puts $myList
This is a tcltk example
由以上可以看出,变量myList已经被修改了,在tcl中如果命令中传入的是变量名一般结果都修改变量,传入的是变量值都不会修改变量本身。
lreplace
list first last ?
element element ...?
将索引为first到last的元素替换为后面的元素:
% lreplace {This is a tcltk example} 2 2 another
This is another tcltk example
% lreplace {This is a tcltk example} 2 3 another TCLTK
This is another TCLTK example
lset
varName ?index...? newValue
这个命令和lappand一样接收一个变量名作为参数,也会修改变量的值,将列表中的指定索引项目修改为指定值,如果不指定索引项就把列表整个换为新的值:
% set myList {This is a tcltk example}
This is a tcltk example
% lset myList 2 another
This is another tcltk example
% puts $myList
This is another tcltk example
如果没有指定索引,就相当于直接赋值:
% lset myList {no index}
no index
linsert
list index element ?
element element ...?
这个命令插入元素到列表的index索引位,产生一个新的列表:
% linsert {This is example} 2 a tcltk
This is a tcltk example
lsort ?
options?
list
为列表排序。
按照ASCII码顺序排序,这个是默认状态:
% lsort -ascii {b A c B a C}
A B C a b c
按照字典顺序排序:
% lsort -dictionary {b A c B a C}
A a B b C c
按照整数排序,要求列表里面的元素都能正确转化为整数:
% lsort -integer {11 13 15 56}
11 13 15 56
按照浮点数排序,要求列表里面的元素都能够正确转化为浮点数:
% lsort -real {11.1 22.2 14.3}
11.1 14.3 22.2
按照命令排序,命令体必须是接收两个参数的命令,结果返回大于、小于或者等于0分别代表两个元素相比较是大于、小于还是等于关系,利用此关系进行排序:
% lsort -command {string compare} {b A c B a C}
A B C a b c
按照升序排列,这是默认形式:
% lsort -increasing {b A c B a C}
A B C a b c
按照降序排列:
% lsort -decreasing {b A c B a C}
c b a C B A
返回排序后的元素在原列表中的索引:
% lsort -indices {b A c B a C}
1 3 5 4 0 2
根据子列表排序,每个元素必须是一个命令能够正确识别的子列表,-index 1表示根据子列表的第二个元素来排序:
% lsort -index 1 {{b A} {c B} {a C}}
{b A} {c B} {a C}
忽略大小写:
% lsort -nocase {b A c B a C}
A a b B c C
lreverse
list
返回一个列表,列表为原列表的反序形式:
% lreverse {This is a tcltk example}
example tcltk a is This