目录
1.列表
列表是Tcl中一种数据结构,是元素的有序集合,元素可以包含任何字符串,如空格、反斜线、换行符等,可以把列表赋值给一个变量、作为参数传给命令、嵌套到其他列表中。
创建、获取列表
通过set命令创建列表,该命令后有两个参数:列表名、列表包含的元素。元素位于一个大括号之内且以空格为界,如果某个元素中包含空格,则将该元素放在大括号或双引号之内。
也可以通过list命令创建列表,list之后直接跟列表元素(下图需要用[]进行命令替换)。
命令concat将多个列表拼接在一起,构成一个新的列表,concat后跟随一个或多个列表。
命令lrepeat通过重复元素集合创建列表,该命令后至少有两个参数:重复次数、重复元素、重复元素...。
列表中可以包含特殊字符,如"$""[]"等,可通过大括号或反斜线置换实现。
命令llength获取列表长度,即列表所包含的元素个数,llength后跟随列表。
命令lindex获取相应的列表元素,有两个参数:列表和索引参数。若索引参数超出列表的索引范围,则返回空字符串。对于嵌套的列表,索引参数可由一个或多个索引值构成,获取子列表中过的元素。
命令lrange用于获取指定范围内的列表元素,有三个参数:列表、索引值1、索引值2。若索引值1=索引值则返回对应元素;若索引值2<索引值1则返回空列表。
命令lassign可以获取列表元素的同时将其分配给指定变量,有一个或多个参数:列表、变量名...。若列表长度大于变量个数则lassign将列表元素分配给对应变量的同时,返回未被分配的列表元素;若列表长度小于变量个数,lassign会给多于变量分配一个空字符。
添加、删除、替换列表元素
命令lappend向列表末尾添加新元素,lappend接收的第一个参数存放列表的变量名而非列表本身,是一种”原地“操作,第二个参数开始为新添加的元素(一个或多个)。
命令linsert向列表的指定位置添加新元素,有三个或多个参数:列表、新元素的起始索引、新元素...,返回值是一个由原列表和新元素构成的新列表,但原列表并没有被改动。
命令lreplace用于删除列表元素,有三个参数:列表、待删除部分元素的起始索引、终止索引,返回删除元素后的新列表,但原列表并没有被改动。
命令lreplace用于替换列表中的元素,有四个参数,前三个参数不变,第四个参数为替换元素,同样原列表并没有被改动。
命令lset可以对列表进行原地替换,有三个参数:列表变量名、替换索引、替换值。如果lset的索引参数超过了给定列表的索引范围,则会报错。
搜索列表元素、对列表元素排序
命令lsearch在列表中査找指定的元素,有两个参数:列表、匹配,返回列表中第一个与指定模式匹配的元素的索引,如果没有匹配的元素则返回-1。lsearch有三种搜索模式,-glob、-exact、-regexp。-glob 指定匹配按照 stringmatch命令的规则进行;-regexp指定匹配按照正则表达式规则进行;-exact 则要求进行严格匹配。如果没有指定匹配方式,那么默认设置为-glob。
-all选项使得lsearch返回列表中所有与给定模式匹配的元素索引。
-inline选项返回与给定模式匹配的列表元素而非索引,且可与-all同时使用。
-start选项限定搜索的起始索引,,且可与-all、-inline等同时使用。
-not选项可对匹配结果取反,且可与-all、-inline同时使用。
命令lsort可对列表元素排序,只有一个列表参数,返回值为排序后的结果。默认按照-ascii -increasing的顺序排序。
-integer要求列表中的元素都是整数,进行升序排序。
-real要求列表中的元素都是浮点数,进行升序排序。
-unique对列表排序的同时还会去掉重复的元素。
-index可指定子列表中的元素索引对子列表进行排序。
in操作符用于如果指定元素再给定列表里,则表达式返回值为1、否则为0;ni(not in)与in相反。
字符串和列表之间的转换
在Tcl中所有的数据类型都可被视为字符串,而字符串本身则由一个或多个字符组成,那么列表就可以看作由一个或多个相对独立的字符串构成,因此二者在一定条件下可以相互转换。
命令split可将字符串按照指定规则进行分割,并返回分割后由哥哥字符串构成的列表。有两个参数:字符串变量、分割字符,分割字符可以是空元素、一个字符或多个字符。如果字符串中连续出现分割字符,或分割字符出现在字符串的开头或借位,则返回结果中会产生空元素。
命令join把列表元素拼接成一个字符串,元素之间用指定的分割字符隔开,有两个参数:列表、分割字符,分割字符可以是空元素或换行符。
2.数组
Tcl中数组是一系列元素的集合,每个元素都是由元素名称和值构成的变量,元素名称由数组名和数组中的元素名构成。创建数组的过程就是对变量进行赋值的过程。在Tcl中任何合法的字符串都课题作为数组名或元素名,也可以作为变量值。元素名与值是成对创建的,因此数组也被称为关联数组(Associative Array)。
创建数组
可通过set命令、array set命令创建数组。
命令array exists判断指定数组是否已被创建,若被创建则返回1、否则返回0.
命令array size获取指定数组的大小,即元素的个数。
获取数组中的元素
已知数组名和元素名,可以获取相对应的值。若数组中的元素是变量,则要获取变量名,再通过变量置换符$获取变量值。
命令array names可返回一个包含指定数组元素名的列表。
命令array get可获得指定数组的“元素名 值”列表,也可用于赋值数组。
命令parray用于输出数组的“元素名 值”对。
删除数组中的元素
命令unset用于删除变量(数组中的元素)或数组,只有一个参数即待删除变量名或数组名。
数组与列表之间的转换
通过foreach语句对列表进行遍历,创建数组。