轻松掌握:TCL编程里的数组操作指南
一、介绍
Tcl 中的数组和其他高级语言的数组有些不同:Tcl 数组元素的索引,或称键值,可以是任意的字符串,而且其本身没有所谓多维数组的概念。数组的存取速度要比列表有优势,数组在内部使用散列表来存储,每个元素存取开销几乎相同,而列表的存取数据花非时间与其长度成正比。
二、数组的定义与格式
数组索引是由圆括号()来指定的,每个数组元素变量名的格式是“数组名(索引值)”。数组
元素使用 set 命令来定义和赋值:
[语法]:set arrName(index) value
也可以用 array 命令来定义一个数组:
[语法]:array set arrName { index1 value1 index2 value2 ...}
这个命令在定义数组的同时可以定义其元素和元素值。需要注意元素索引(index-n)与元素值(valun-n)要成对输入,否则会出错。用命令 array set arrName “”可以定义一个空数组。用普通变量值的获取方法——替换操作来获取数组元素值:
[语法]:set val $arrName(index)
数组元素索引也支持替换操作,包括变量和命令替换,如:
[语法]: set val $arrName($index)
set val $arrName([expr $index + 1])
Tcl 数组索引的值不象其他高级语言如 C 语言那样,要求一定是整数。Tcl 允许索引值为包括数字字符在内的所有合法字符组成的字符串。
array set arr1 "" ;#定义了一个空数组 set array01(5) "Hello World" 结果=> Hello World puts $array01(5) 结果=>Hello World set array01(Hello) World 结果=> World puts $array01(Hello) 结果=> World array names array01 ;#array names 命令显示数组元素名 结果=> Hello 5 array set arr2 {1 a 2 b 3 c 4 d} array names arr2 结果=> 4 1 2 3 parray arr2 ;# 输出数组全部内容 结果=> arr2(1) = a arr2(2) = b arr2(3) = c arr2(4) = d
三、多维数组
在有些时候,可能需要象 C 语言这样:
int arr[2][2] arr[0][0] = 100
来定义一个多维数组来处理数据。Tcl 并没有直接支持这种数组的格式,使用者自己可以定
义所谓的多维数组,如:
set arr(0,0) 100 set arr(0,1) 200 parray arr 结果=> arr(0,0) = 100 arr(0,1) = 200
由于 Tcl 数组索引的灵活性,使用时要小心,否则可能得不到预期的结果,如忘记了上面索
引的逗号,就成了:
set arr(00) 100 parray arr 结果=> arr(0,0) = 100
arr(0,1) = 200
四、数组操作指令
命令格式 |
说明 |
array exists arr |
判断 arr 是否为数组变量,是返回 1 |
array get arr ?pattern? |
返回一个包含交替出现索引、元素值的列表。pattern 选择匹配索引。如果不指定 pattern,返回所有的元素索引和值。 |
array names arr ?pattern? |
返回索引 |
array set arr list |
初始化数组 |
array size arr |
数组大小 |
array startsearch arr |
返回用于 arr 进行搜索的搜索标记 |
array nextelement arr index |
返回下一个元素值,如果已在尾部的话,返回空串 |
array donesearch arr index |
结束有 index 标识的搜索 |
parray arr |
打印出 arr 的所有元素变量名和元素值 |
1.array get 命令
array get 命令提取数组索引、元素值对并将这些值对组织成一个列表。而 array set 命令 则将一个列表(数据要成对)转换成一个数组。例
array set arr [list a AAA b BBB c CCC d DDD] array size arr ;#数组元素个数 结果=> 4 parray arr 结果=> arr(a) = AAA arr(b) = BBB arr(c) = CCC arr(d) = DDD set l1 [array get arr] 结果=> d DDD a AAA b BBB c CCC
2.array names命令
array names 返回所有元素索引名与模式 pattern 匹配的元素索引名列表。模式 pattern 和 string match 的模式格式相同。如果 pattern 没有指定,则返回所有数组元素索引名列表。
array set a [list "School,BUPT" "BUPT" "School,NJU" "NJU" "School,NJUA" "NJUA"] % parray a 结果=> a(School,BUPT) = BUPT a(School,NJU) = NJU a(School,NJUA) = NJUA array names a "School,*" 结果=>School,NJU School,NJUA School,BUPT array names a "School,N*" 结果=>School,NJU School,NJUA array names a 结果=>School,NJU School,NJUA School,BUPT
array names 命令
推荐阅读
-
掌握Dart编程语言:操作符的使用指南
-
轻松掌握S7-200 PLC的PID指令:图解指南让你快速上手OUT操作
-
AI编程大潮来袭!轻松掌握GitHub AI助手Copilot的使用指南
-
不会编程也能做手机应用!轻松掌握自创APP的简易步骤指南
-
轻松掌握ADB协议在安卓设备中的实际应用操作指南
-
轻松掌握 Android 开发神器:adb的基本操作与实战技巧(无线模式下的调试指南)
-
轻松掌握Java编程:一份详明的Java学习指南
-
【2022新手指南】Java编程进阶之路 - 六、技术架构篇 ### MySQL索引底层解析与优化实战 - 你会讲解MySQL索引的数据结构吗?性能调优技巧知多少? - Redis深度揭秘:你知道多少?从基础到哨兵、主从复制全梳理 - Redis持久化及哨兵模式详解,还有集群搭建和Leader选举黑箱打开 - Zookeeper是个啥?特性和应用场景大公开 - ZooKeeper集群搭建攻略及 Leader选举、读写一致性、共享锁实现细节 - 探究ZooKeeper中的Leader选举机制及其在分布式环境中的作用 - Zab协议深入剖析:原理、功能与在Zookeeper中的核心地位 - RabbitMQ全方位解读:工作模式、消费限流、可靠投递与配置策略 - 设计者视角:RabbitMQ过期时间、死信队列与延时队列实践指南 - RocketMQ特性和应用场景揭示:理解其精髓与差异化优势 - Kafka详细介绍:特性及广泛应用于实时数据处理的场景解析 - ElasticSearch实力揭秘:特性概述与作为搜索引擎的广泛应用 - MongoDB认知升级:非关系型数据库的优势阐述,安装与使用实战教学 - BIO/NIO/AIO网络模型对比:掌握它们的区别与在网络编程中的实际应用 - Netty带你飞:理解其超快速度背后的秘密,包括线程模型分析 - 网络通信黑科技:Netty编解码原理与常用编解码器的应用,Protostuff实战演示 - 解密Netty粘包与拆包现象,怎样有效应对这一常见问题 - 自定义Netty心跳检测机制,轻松调整检测间隔时间的艺术 - Dubbo轻骑兵介绍:核心特性概览,服务降级实战与其实现益处 - Dubbo三大神器解读:本地存根与本地伪装的实战运用与优势呈现 ----------------------- 七、结语与回顾
-
轻松掌握minicom的优雅操作指南
-
轻松掌握 Torch-RecHub中的特征层操作指南