TCL列表处理常用命令

一、列表

列表是TCL中一种数据结构,是元素的有序集合,元素可以包含任何字符串,如空格、反斜线、换行符等,可以把列表赋值给一个变量、作为参数传给命令、嵌套到其他列表中。
通过set命令创建列表,该命令后有两个参数:列表名、列表包含的元素。元素位于一个大括号之内且以空格为界,如果某个元素中包含空格,则将该元素放在大括号或双引号之内。
TCL列表除了用[list ],还可以使用双引号或花括号等来定义。

代码如下(示例):

#创建列表x
set x "a b c";
puts "Item at index 2 of the list{$x} is : [lindex $x 2]\n";
#创建列表y
set y {a b {cd} {e f {g h}}}
puts "Treated as a list : $y\n"
#创建列表z
set z [list puts "arg 2 is $y"];
puts "A command resemble : $z\n";

#执行结果
a b c
Item at index 2 of the list{a b c} is : c

a b {cd} {e f {g h}}
Treated as a list : a b {cd} {e f {g h}}

puts {arg 2 is 12 3 56}
A command resemble : puts {arg 2 is 12 3 56}

二、常用命令

TCL语言中处理列表的一些基本命令能够帮助程序员有效地管理和操作列表数据,比如concat、lappend、llength、lindex、lrange、linsert、lreplace、lsearch、lsort、join 、split和foreach等命令。

1. list

list命令用于创建和操作列表。

代码如下(示例):

#创建列表
set days [list Sun Mon Tues] 
puts $days

输出:
Sun Mon Tues

2. concat

concat命令用于将多个字符串拼接成一个字符串并返回。
代码如下(示例):

set str1 "Hello"
set str2 "world"
set str3 "!"
set result [concat $str1 " " $str2 $str3]
puts $result

输出:
Hello world!

3. lappend

lappend用于在列表的末尾加入一个或多个元素。
代码如下(示例):

set mylist {one two three}
lappend mylist four
puts $mylist

输出:
one two three four

4. llength

llength用于获取一个列表的长度。它返回一个整数值,表示列表中包含元素的数量。
代码如下(示例):

set list {apple banana orange}
set length [llength $list]
puts "The length of the list is $length"

输出:
The length of the list is 3

5. lindex

lindex命令用于获取列表中指定索引位置处的元素。
代码如下(示例):

set x {1 4 5}
lindex $x 1  #索引从第0个元素开始

输出: 
4

6. lrange

lrange命令用于获取List中的子序列。
代码如下(示例):

set list {a b c d e f g}
set sub_list [lrange $list 2 5] #从list的第3个元素(索引为2)开始获取到第6个元素(索引为5),并将获取到的子序列存储到一个新的List中
puts $sub_list

输出:
c d e f

7. linsert

linsert命令用于在一个列表中插入一个元素。它可以在指定的位置插入元素,并返回更新后的列表。linsert命令不会改变原始的列表。
代码如下(示例):

set mylist {apple banana cherry}
set newlist [linsert $mylist 1 orange] #在原始列表mylist中,在第1个位置插入元素orange,生成新的列表newlist
puts $newlist

输出:
apple orange banana cherry

8. lreplace

lreplace命令将一个指定区段的列表元素替换为新元素或者删除元素。替换并不会改变原来列表的内容,而是返回一个新的列表。
代码如下(示例):

#替换指定索引位置的元素
set my_list {a b c d e f g}
set new_list [lreplace $my_list 2 4 x y z] #将my_list列表中的第3个(索引为2)到第5个元素(索引为4)(即c、d和e)替换为x、y和z
puts $new_list

输出:
a b x y z f g

#删除指定索引位置的元素
set mylist {a b c}
set idx [lsearch $mylist "b"]
set mylist [lreplace $mylist $idx $idx]
puts $mylist

输出:
a c

9. lrepeat

lrepeat命令将一个指定的元素重复多次,并返回一个包含这些重复元素的列表。

代码如下(示例):

set mylist [lrepeat 3 "hello"]
puts $mylist

输出:
hello hello hellod

10. lset

lset用于设置一个列表中的指定元素的值。
代码如下(示例):

set mylist {a b c d e}
lset mylist 2 newval #lset命令将mylist列表的第3个元素(索引值为2)(即“c”)的值改为“newval”

输出:
a newval c d e

11. lassign

lassign用于将一个列表的元素赋值给多个变量。它可以方便地将一个列表中的值分配到多个变量中,而无需使用多个set命令或手动遍历列表。
代码如下(示例):

set mylist {apple banana orange}
lassign $mylist fruit1 fruit2 fruit3#lassign命令将这些元素分配给3个不同的变量fruit1、fruit2和fruit3
puts $fruit1
puts $fruit2
puts $fruit3

输出:
apple
banana
orange

12. lsearch

lsearch是TCL的一个函数,用于在一个列表中查找指定元素的位置。它可以返回元素在列表中第一次出现的索引,也可以返回一个布尔值表示元素是否在列表中存在。有一些参数可以使用:
-exact: 表示精确匹配,查找元素时会考虑大小写。
-glob: 表示使用Glob模式进行匹配。
-regexp: 表示使用正则表达式进行匹配。
-all: 表示查找所有的匹配项,而不是只返回第一个匹配项的索引。

代码如下(示例):

set names {Jack Tom Mary Tom}
set index [lsearch $names "Tom"] #要查找名字为Tom的人在列表中的位置,lsearch函数会查找列表中第一个值为"Tom"的元素,返回其索引1。另外,这里的 "Tom" 使用了双引号,表示进行精确匹配
puts $index
 
输出:
1

13. lsort

lsort 命令实现对列表的排序。它根据提供的排序选项对给定的列表进行排序。排序不影响原表,返回新表。
有一些参数可以使用:
-ascii:按字典顺序(ASCII码顺序)排序
-dictionary:按字典顺序(忽略大小写)排序
-increasing:升序排序(默认)
-decreasing:降序排序
-integer:按整数值排序
-real:按浮点数值排序
默认-ascii、-increasing。
代码如下(示例):

set mylist {aaa bbb ccc ddd eee}
set sortedList [lsort $mylist]
puts $sortedList

输出:
aaa bbb ccc ddd eee

14. join

join命令用于将列表(list)转换成字符串(string),并可以指定分隔符。
代码如下(示例):

set fruits {apple banana orange}
set separator ","
set result [join $fruits $separator] #使用join命令将fruits列表转换为字符串,并指定分隔符为逗号
puts $result

输出:
apple,banana,orange

15. split

split命令作用于join相反,接受一个字符串,并根据给定的字符将其分割转换成一个列表。split默认分割符为所有空白字符(空格、制表符、换行符等)。
代码如下(示例):

set str "This is a test"
set list [split $str] #split命令将字符串分割成多个子串,存储到列表变量list中。由于没有指定分隔符,因此默认使用空白字符对字符串进行分割
puts $list

输出:
This
is
a
test

16. foreach

foreach命令控制结构遍历整个列表,逐次取出列表的每个元素的值放到指定变量中。
代码如下(示例):

set values {a b c d e f g h}
foreach value $values {
    puts $value
}

输出:
a
b
c
d
e
f
g
h

三、进阶实例

如果想要从list2中删除list1中元素,示例如下。
代码如下(示例):

#定义proc
proc ldelete { list2 list1 } {
	set source_list $list2
	set delete_list $list1
	foreach value $delete_list {
		for { set i 0 } { $i < 100 } { incr i } {
			set idx [lsearch -exact $source_list $value] 
			if { $idx >= 0 } {
				set source_list [lreplace $source_list $idx $idx]
			} else {
				break	
			}
		}
		if { $i >= 100 } {
			puts "Error: $value exceeds 100 times in $source_list"
		}
	}
	return $source_list
}

#调用proc
set s_list [list a b c d e]
set d_list [list b e]
set mylist [ldelete $s_list $d_list]
puts "$mylist"

输出:
a c d
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值