一、介绍

列表则是具有特殊解释的字符串。Tcl 中的列表操作和其它 Tcl 命令一样具有相同的结构。列表可应用在诸如 foreach 这样的以列表为变元的循环命令中,也应于构建 eval 命令的延迟命令字符串。

二、TCL列表相关命令

命令

说明

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。相当于一个循环控制语句。

二、相关命令

1.list 命令

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

set l1 [list Sun Mon Tues]
结果=>Sun Mon Tues set l2 [list $l1 Wed] ;#列表 l1 含有三个元素
结果=> {Sun Mon Tues} Wed set str1 "Sun Mon Tues"
结果=>Sun Mon Tues set l2 [list $str1 Wed] ;#列表 l2 中含有两个元素。第一个元素用花括号括起来。
结果=>{Sun Mon Tues} Wed ;#和上面的命令结果相同:“列表是特殊的字符串”。

2.concat 命令

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

set x {1 2}
结果=> 1 2 set y "$x 3 " ; #$x 被替换后,作为列表结构的花括号被去掉,
结果=> 1 2 3 ; #元素被提出来和 3 一起作为新列表的元素 set y "$x {3}"
结果=> 1 2 {3} set y [concat $x 3] ;#结果同上面的双引号
结果=> 1 2 3 set y [concat $x {3}]
结果=> 1 2 3

3.lindex 命令

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

set x { 1 2 3 }
结果=> 1 2 3 puts [lindex $x 1]
=>2

4.llength 命令

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

set length "1 2 3 4 5"
结果=>1 2 3 4 5 ;#定义了一个字符串
set num [llength $l1] ;#这里 l1 被看作列表了
=>5

5.lrange 命令

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

lrange {1 2 3 {4 5} 6} 2 end
结果=> 3 {4 5} 6

6.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 ;# x 的值没有改变 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 ;#new 的内容并没有改变,这和 string replace 相同。 set y [lreplace $new 1 2]
结果=>1 2 ;#将第 1、2 个元素删除

7.lsearch 命令

lsearch 命令在给定列表中搜索与匹配字符串匹配的元素,成功就返回正确的元素索引,否则返回-1。lsearch 支持通配符格式,但可以使用-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

8.lsort 命令

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

set list "a Z z n100 n200 M p Hl hL m 1 20"
结果=>a Z z n100 n200 M p Hl hL m 1 20 lsort -ascii $list
结果=>1 20 Hl M Z a hL m n100 n200 p z lsort -dictionary $list
结果=>1 20 a Hl hL M m n100 n200 p Z z

9. join 与 split 命令

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

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

split 命令的作用与 join 的作用相反,它接收一个字符串,并根据给定的字符将其分割转换成

一个列表。

set str cm8/auto/tools/aries/ASAM/NE/SNMP/IMPL/ne_create_board.tcl
结果=>cm8/auto/tools/aries/ASAM/NE/SNMP/IMPL/ne_create_board.tcl
set s /
结果=>/ set l1 [split $str $s]
结果=> cm8 auto tools aries ASAM NE SNMP IMPL ne_create_board.tcl set l2 [split $str "/."] ;#可以指定多个分割符
结果=> cm8 auto tools aries ASAM NE SNMP IMPL ne_create_board tcl

 10.foreach 控制结构

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

set lst "1 2 3 4"
结果是=>1 2 3 4 foreach l1 $lst {
puts $l1
}
结果是=>
1
2
3
4

TCL语言笔记:TCL中的列表操作的更多相关文章

  1. TCL语言笔记:TCL基础语法

    一.什么是TCL Tcl 全称是 Tool command Language.它是一个基于字符串的命令语言,基础结构和语法非常简单,易于学习和掌握. Tcl 语言是一个解释性语言,所谓解释性是指不象其 ...

  2. Python中的列表操作

    Python的列表操作可谓是功能强大且方便(相对于Java)简单.常规的操作就不说了(这不是一个入门教程),介绍几个很有特点的例子 添加 # 追加到结尾(append) li = [1, 2, 3, ...

  3. 【Python】Python中的列表操作

    Python的列表操作可谓是功能强大且方便(相对于Java)简单.常规的操作就不说了(这不是一个入门教程),介绍几个很有特点的例子 添加 # 追加到结尾(append) li = [1, 2, 3, ...

  4. python学习笔记(二)列表操作

    列表及列表操作: 列表是最常用的数据类型之一,列表也叫数组,列表定义,使用[]即可:列表里面可以再套列表,一个里面套一个列表,叫二维数组:一个里面套一个列表,里面的列表再套一个列表,这个叫三位数组,套 ...

  5. JavaWeb学习笔记——jquery中的dom操作

     jquery中的dom操作 废话不说:直接上例子: 1.添加节点-html页面 Append:向每个匹配的元素内部追加内容. <body> <ul id="city& ...

  6. TCL语言笔记:TCL中的数组

    一.介绍 Tcl 中的数组和其他高级语言的数组有些不同:Tcl 数组元素的索引,或称键值,可以是任意的字符串,而且其本身没有所谓多维数组的概念.数组的存取速度要比列表有优势,数组在内部使用散列表来存储 ...

  7. TCL语言笔记:TCL中的数学函数

    一.TCL数学函数列表 函数名 说明 举例 abs(arg) 取绝对值 set a –10  ; #a=-10 set a [expr abs($a)]; # a=10 acos(arg) 反余弦 s ...

  8. TCL语言笔记:TCL中的String命令

    一.介绍 字符串是 Tcl 中的基本数据类型,所以有大量的字符串操作命令.一个比较重要的问题就是模式匹配,通过模式匹配将字符串与指定的模式(格式)相匹配来进行字符串的比较.搜索等操作. 二.strin ...

  9. TCL语言笔记:TCL中的控制结构命令

    一.引言 控制结构允许程序根据不同的状态.条件和参数来选择不同的处理和执行路径,从而使代码具有更强的灵活性.健壮性和可读性. Tcl 提供了 if.if/else.if/elseif.foreach. ...

随机推荐

  1. JDK 动态代理实现原理

    一.引言 Java动态代理机制的出现,使得Java开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象便能动态生成代理类.代理类会负责将所有方法的调用分派到委托对象上反射执行,在分派执行的过 ...

  2. crontab的应用

    当我们需要定时执行某个系统内的php脚本程序时,可以这样设置crontab * 19 * * * /usr/local/php/bin/php /var/www/test.php 此处表示调用php( ...

  3. [JS进阶] 编写可维护性代码 (1)

    今天的web应用大至成千上万行的javascript代码,执行各种复杂的过程,这种演化让我们开发者必须得对可维护性有一定的认识!编写可维护性代码很重要,很多情况下我们是以他人的工作成果为基础,确保代码 ...

  4. 11g RAC R2 体系结构---进程,日志

    进程结构:Overview of Oracle Clusterware Platform-Specific Software Components When Oracle Clusterware is ...

  5. Dataguard之redo传输服务

    一.Data Guard架构 整个Data Guard体系就是围绕三个关键点展开: 日志发送(Redo Send) 日志接收(Redo Receive) 日志应用(Redo Apply) 二.日志发送 ...

  6. .NET Framework 3.5 安装错误:0x800F0906、0x800F081F、0x800F0907

    使用Add-WindowsFeature 照成的问题 I get the failure below..  If I pick the Server 2012 R2 image from 8/15/2 ...

  7. Linux关机命令总结

    在linux命令中reboot是重新启动,shutdown -r now是立即停止然后重新启动,都说他们两个是一样的,其实是有一定的区别的. shutdown命令可以安全地关闭或重启Linux系统,它 ...

  8. MAC 平台 QT编写iphone程序,加载iphone模拟器失败解决办法

    本日这么多年一直做C++开发,最近要做QT项目,被QT做界面的新特性所吸引.QSS QML的确是亮点. 还有一个就是跨平台这方面,自己玩了玩. 用的QT 的开发包是在官网上下载 qt-opensour ...

  9. (Android学习系列)三,窗口的常用事件

    设置窗口标题事件和在Activity之间跳转 新建一个项目,新建两个Activity:MainActivity,TitleActivity ,然后再AnroidManifest.xml 中注册Titl ...

  10. php将数据库导出成excel的方法

    <?php $fname = $_FILES['MyFile']['name']; $do = copy($_FILES['MyFile']['tmp_name'],$fname); if ($ ...