Tcl 列表操作

1. 列表命令集 

列表相关命令 

命令 说明
list arg1 arg2 ... 创建一个列表
lindex list index 返回列表 list 中的第 index 个元素( element)值
llength list 计算列表 list 元素个数
lrange list index1 index2 返回指定范围内(从 index1 index2)的元素
lappend list arg1 arg2 ... 将新元素追加到原来列表 list 后组成新的列表
linsert list index arg1 arg2 ... 将新元素插入到 list 中位于 index 元素之前的位置上
lreplace list index1 index2 arg1 arg2 ... 替换指定范围的元素
lsearch ?mode? list value 根据匹配模式 mode,查找 list 中与 value 匹配的元素位置索引。 mode 一般为-exact-glob - regexp.默认为-glob。找不到返回-1
lsort ?switches? list 根据 开关选项对列表进行排序
concat list1 list2 ... 连接多个列表内容成一个列表
join list joinChars joinChars 为分隔符将列表中的元素合并在一起
split string splitChars splitChars 中的字符作为分隔符将字符串分解为列表元素。
foreach var list {proc body} 遍历列表各项,逐次将各元素值存入 var 中并执行proc body。相当于一个循环控制语句。

2.  list 命令 

list 命令用来创建列表。一个列表可以包含子列表,即列表可以嵌套。 

使用 list 命令创建列表示例:

  • set l1 [list Sun Mon Tues]

    •  => Sun Mon Tues     #列表l1中含有三个元素

  • set l2 [list $l1 Wed]

    •  => {Sun Mon Tues} Wed    #列表l2中含有两个元素。第一个元素用花括号括起来

  • set str1 "Sun Mon Wed"

    •  => Sun Mon Tues

  • set l2 [list $str1 Wed]

    •  => {Sun Mon Tues} Wed     #和上面的命令相同,列表是特殊的字符串

  • set l1 [list "Sun Mon Tues" "Wed"]

    •  => {Sun Mon Tues} Wed    #当元素是一个字符时,就被花括号括起来了

  • set b 10

  • set l3 [list {a $b c} d] 

    •  => {a $b c} d

  • set l3 [list "a $b c" d]

    •  => {a 10 c} d

3. concat 命令 

concat 命令以空格为分隔符将多个列表拼装在一起形成新的列表。它和双引号的作用比较相似。

list 命令和 concat 命令都可以完成列表合并功能。 list lappend 命令保留每个列表的结构,将每个列表作为一个整体生成新列表的元素来完成。而 concat 命令则要先把各个列表的最外层列表结构去掉,将其中的所有元素取出来作为新列表的元素来完成合并,即新列表的每个元素也是合并前列表的元素。 

  • set x {1 2}       #花括号创建一个列表

    •  => 12

  • set y "$x 3"    #$x被替换后,作为列表结构的花括号被去掉

    •  => 1 2 3

  • set y "$x {3}"

    •  => 1 2 {3}

  • set y [concat $x 3]    #结构同“”的作用一样

    •  => 1 2 3

  • set y [concat $x {3}]

    •  => 1 2 3

  • set y [list $x 3]

    •  => {1 2} 3

  • set y [list $x {3}]

    •  => {1 2} 3

  • set y [lappend x 3]

    •  => {1 2} 3

4. lappend 命令 

lappend 命令用来将新元素追加到列表末尾。 

lappend 命令简单例子:

  • lappend new 1 2    #lappend命令也可以用来创建一个列表

    •  => 1 2

  • lappend new {3 4} "5" {6} 7    #单个元素的双引号和花括号被剥离了

    •  => 1 2 {3 4} 5 6 7

  • set new

    •  => 1 2 {3 4} 5 6 7

5. llength 命令 

llength 命令可以获得一个列表内元素的个数。 

llength 命令的一个简单例子:

  • set l1 "1 2 3 4 5"

    •  => 1 2 3 4 5    # 定义了一个字符串

  • set num [llength $l1]     #这里l1被看成列表了

    •  => 5

列表是用空格搁开的多个元素组成的字符串,而通过 list 相关命令得到了特殊解释。既然 list是字符串,那么所有适用于字符串的操作命令也应该适用于列表。 

6. lindex 命令 

lindex 命令返回列表中指定位置的特定元素。列表索引从 0 开始记数! 

lindex 命令的一个简单例子:

  • set x {1 4 5}

    •  => 1 4 5

  • lindex $x 1

    •  => 4

  • lindex $x end

    •  => 5

  • lindex $x end-1

    •  => 4

  • lindex $x first

    •   => bad index "first" :  must be interer or end

7. lrange 命令 

lrange 命令返回一个指定区段的列表元素,可以以 end 或者 end-n 作为索引(n 为正整数)。 

  • lrange {1 2 3 {4 5} 6} 2 end

    •  => 3 {4 5 } 6

8. linsert 和 lreplace 命令 

linsert 命令用来将元素插入到一个列表的由索引指定的位置。如果索引为 0 或者更小,则元素就会被添加到最前面。如果索引值大于或者等于列表长度,则元素被追加到列表尾部。其他情况元素被添加到指定位置之前。 

lreplace 命令将一个指定区段的列表元素替换为新元素。如果没有指定新元素,则这个区域的元素就会被从列表中删除。 

  • set x {1 2}

    •  => 1 2

  • set new [linsert $x 0 he she]

    •  => he she 1 2

  • set new [linsert $x end he she]

    •  => 1 2 he she

  • set new [linsert $x 1 he she]

    •  => 1 he she 2

  • puts $x

    •  => 1 2

  • puts $new

    •  => 1 he she 2

  • set y [lreplace $ new 1 2 B C]

    •  => 1 B C 2

  • set y [lreplace $ new 0 0]

    •  => he she 2

  • puts $ new

    •  => 1 he she 2

  • set y [lreplace $new 1 2]

    •  => 1 2

9. lsearch 命令 

lsearch 命令在给定列表中搜索与匹配字符串匹配的元素,成功就返回正确的元素索引,否则返回-1lsearch 支持通配符格式,但可以使用-exact 选项将其屏蔽而进行精确匹配。

  • set l1 [list This is one list]

    •  => This is one list

  • set index [lsearch $l1 l*]

    •  => 3

  • set index [lsearch -exact $l1 l*] 

    •  => -1

  • set index [lsearch -exact $l1 list]

    •  => 3

10.  lsort 命令 

lsort 命令实现对列表的排序。排序操作不影响原表,而是返回排序之后的新表。

排序的方式有多种选择,可以通过-ascii-dictionary –integer-real 来指定基本排序类型,然后使用-increasingdecreasing 指定排列方式,默认为-ascii-increasing 。要注意ASCII 排序时使用字符编码;而 dictionary 排序方式整合大小写,并将包含的数字以数值大小来处理。 

  • set list "a Z z n100 n200 M p HI hL m 1 20"

    •  => a Z z n100 n200 M p HI hL m 1 20

  • lsort -ascii $list

    •  => 1 20 HI M Z a hL m n n100 n200 p z

  • lsort -dictionary $list

    •  => 1 20 a HI hL M m n n100 n200 p Z z

11. join split 命令 

join 命令接收一个列表,并用指定的分隔符将列表元素整合成一个字符串。

  • join {1 {2 3} {4 5 6}} :
    •  => 1:2 3 : 4 5 6

split 命令的作用与 join 的作用相反,它接收一个字符串,并根据给定的字符将其分割转换成一个列表。用于分割的字符应该在字符串中存在,否则 split 因为没有搜索到对应字符而将整个字符串作为唯一列表元素而返回,即返回原字符串。 

12. foreach 控制结构 

foreach 命令/控制结构会遍历整个列表,逐次取出列表的每个元素的值放到指定变量中,使用者可以在跟随的过程体中添加必要的处理过程。 

  • set l1 [list This is one list]

    •  => This is one list

foreach elem $l1 {

  puts "---$elem---"

}

 =>  ---This---

        ---is---

  ---one---

  ---list---

本例 foreach 在每次循环进行时,依次将列表 l1 中的一个元素值赋值给 elem 变量。foreach 命令还可以同时对多个列表进行操作,而且还可以同时操作同一列表的多个元素。如果在最后一次循环之前就遍历完了某个列表,则与之对应的循环变量就会以空字符串来赋值。 

foreach {x1 x2} {Orange Blue Red Green Black} x3 {Right Left Up Down} {

  puts [format "x1=%8s x2=%8s x3=%8s" $x1 $x2 $x3]

}

 => x1= Orange x2= Blue x3= Right

       x1= Red x2= Green x3= Left

  x1= Black x2= x3= Up

  x1= x2= x3= Down 

posted @ 2024-04-13 16:48  小熊酱  阅读(22)  评论(0编辑  收藏  举报