TCL脚本语言
- 1. TCL置换
- 1.1 变量置换
- 1.2 命令置换
- 1.3 反斜杠置换
- 1.4 其它符号
- 1.4.1 双引号`" "`
- 1.4.2 花括号`{}`
- 1.4.3 `#`注释
- 2.变量、数组、列表
- 2.1 变量
- 2.2 数组
- 2.3 列表
- 2.3.1 列表指令concat
- 2.3.2 列表指令llength
- 2.3.3 列表指令lindex
- 2.3.4 列表指令lappend
- 2.3.5 列表指令lsort
- 2.4 运算
- 2.4.1 数学运算指令expr
- 3. 控制流
- 3.1 控制流if
- 3.2 循环指令foreach
- 3.3 循环控制指令break
- 3.4 循环控制指令continue
- 3.5 循环控制指令while
- 3.6 循环控制指令for
- 4. 过程函数
- 4.1 过程函数proc
- 4.2 全局变量与局部变量
- 5. 正则匹配
- 5.1 正则匹配-量词
- 5.2 正则匹配-锚位
- 5.3 正则匹配-其他字符
- 5.4 正则匹配指令 regexp
- 5.5 捕获变量
- 6.文本处理
- 6.1 open
- 6.2 gets
- 6.3 close
- 6.4 举例
- 6.4.1 例1
- 6.4.2 例2
- 6.4.3 例3
1. TCL置换
1.1 变量置换
用$
表示变量置换
TCL解释器认为$
后面为变量名,将变量置换成它的值。
1.2 命令置换
用[ ]
表示命令置换[ ]
内是一个独立的TCL语句
1.3 反斜杠置换
用\
表示反斜杠置换换行符
、空格
、[
、$
等被TCL解释器当作特殊符号对待的字符,加上反斜杠后变成普通字符。
用\t
表示TAB
用\n
表示换行符
1.4 其它符号
1.4.1 双引号" "
TCL解释器对双引号" "
中$
和[ ]
符号进行变量置换和命令置换
1.4.2 花括号{}
在花括号{}
中,所有特殊字符都将成为普通字符,TCL解释器不会对其做特殊处理
1.4.3 #
注释
#
表示注释
2.变量、数组、列表
2.1 变量
变量就是某个容器的名称,可以存储一个值。变量的名称在程序运行期间保持不变,但是变量的值通常会不断改变
- 定义·:
set
变量名
变量值
- 取值:
$变量名
- 打印变量
XXX
后跟_1
,即XXX_1
2.2 数组
数组:TCL中数组可以存储很多值,通过元素名来进行检索。类似于某件事物(数组名)几种不同属性(元素名),每一种属性有其独立的值。
- 定义:
set
数组名(元素名)
值
- 取值:
$数组名(元素名)
- 使用
array指令
获取数组信息
2.3 列表
列表是标量的有序集合
- 定义:
set
列表名
{元素1 元素2 元素3 .…}
- 取值:
$列表名
TCL中有一系列十分方便的列表操作命令
命令 | 功能 |
concat | 合并两个列表 |
lindex | 选取列表中的某个元素 |
llength | 列表长度 |
lappend | 在列表末端追加元素 |
lsort | 列表排序 |
2.3.1 列表指令concat
- 语法格式:
concat
列表1
列表2
- 功能:将列表1和列表2合并
- concat 后面接3个list
2.3.2 列表指令llength
- 语法格式:
llength
列表
- 功能:返回列表中的元素个数
2.3.3 列表指令lindex
- 语法格式:
lindex
列表
n
- 功能:返回列表中的第n个元素(从0开始计数)
- 获取列表中的最后一个元素
2.3.4 列表指令lappend
- 语法格式:
lappend
列表
新元素
- 功能:列表末尾加入新元素
- lappend一个列表
- 访问{bufx1 bufx2 bufx3}
2.3.5 列表指令lsort
- 语法格式:
lsort
开关
列表
- 功能:将列表按照一定规则排序
-
开关
:默认按照ASCII码进行排序,
-real 默认按照浮点数值大小进行排序
-unique 唯一化,删除重复元素
- 按照ASCII码排序
- 按照数字大小排序
- 唯一化
- 如何得到列表中的最小值
2.4 运算
运算 | Value | Value | Value | Value |
数学运算 | a+b | a-b | a*b | a/b |
逻辑运算 | a<=b | a>=b | a==b | a!=b |
2.4.1 数学运算指令expr
- 语法格式:
expr
运算表达式
- 功能:将运算表达式求值
默认运算结果是整数型。如果想要进行浮点运算,只要将其中任意一个数值,写成浮点形式(有小数点)即可
3. 控制流
3.1 控制流if
注意,脚本语句的{
一定要写在上一行,因为如果不这样,TCL解释器会认为命令在换行符处已结束,下一行会被当成新的命令,从而导致错误
- 例子:判断列表{0 1 2 3 4 5 6} 长度是大于6.还是等于6,还是小于6
3.2 循环指令foreach
- 语法格式:
foreach
变量
列表
循环主体
- 功能:从第0个元素开始,每次按顺序取得列表的一个元素,将其赋值给变量,然后执行循环主体一次,直到列表最后一个元素
3.3 循环控制指令break
- 语法格式:
break
- 功能:结束整个循环过程,并从循环中跳出
3.4 循环控制指令continue
- 语法格式:
continue
- 功能:仅结束本次循环
3.5 循环控制指令while
- 语法格式:
while
判断语句
循环主体
- 功能:如果判断语句成立(返回值非0),就运行脚本,直到不满足判断条件停止循环,此时while命令中断并返回一个空字符串。
3.6 循环控制指令for
- 语法格式:
for
参数初始化
判断语句
重新初始化参数
循环主体
- 功能:如果判断语句返回值非0就进入循环,执行循环主体后,再重新初始化参数。然后再次进行判断,直到判断语句返回值为0,循环结束。
4. 过程函数
4.1 过程函数proc
- 语法格式:
proc
函数名
参数列表
函数主体
- 功能:类似于C语言中的函数。即用户自定义的功能,方便多次调用
4.2 全局变量与局部变量
- 全局变量:在所有过程之外定义的变量
- 局部变量:对于在过程中定义的变量,因为它们只能在过程中被访问,并且当过程退出时会被自动删除。
- 指令global,可以在过程内部引用全部变量
5. 正则匹配
- 定义:正则表达式是一种特殊的字符串模式,用来去匹配符合规则的字符串
- 正则表达式的
\w
,用来匹配一个字母、数字、下划线 - 正则表达式的
\d
。用来匹配一个数字
字符串 | abc123 |
正则表达式 |
|
5.1 正则匹配-量词
\w\w\w\d\d\d这种写法过于繁琐,我们可以用代替重复的量词进行表示。在TCL中常用一下三种量词
符号 | 功能 |
| 零次或多次匹配 |
| 一次或多次匹配 |
| 零次或一次匹配 |
字符串 | abc123 |
正则表达式 |
|
*
和+
的区别:*
可以是零次,+
至少是一次
字符串 | abc123 |
正则表达式 |
|
错误的正则表达式 |
|
?
表示零次或者一次匹配
正则表达式 |
|
字符串 | 12ab34 |
字符串 | ab12ab34 |
5.2 正则匹配-锚位
锚位,用来指示字符串当中的开头和结尾的位置,使我们能够匹配到正确的字符
符号 | 功能 |
| 字符串开头 |
| 字符串结尾 |
123abc123
^/d/d/d表示取前三个数字
/d/d/d$表示取后三个数字
5.3 正则匹配-其他字符
常用的其他字符还有\s
和.
\s
表示空格
字符串 |
|
正则表达式 |
|
.
表示任意一个字符,我们不确定具体是什么字符是就可以用.
表示,
例如已知字符串为”xxx空格xxx空格xxx”
(x为未知字符),用.+\s.+\s.+
就可以匹配
5.4 正则匹配指令 regexp
语法格式 |
|
功能 | 在字符串中使用正则表达式匹配 |
语法格式 | 功能 |
| -nocase将字符串中的大写都当成小写看待 |
| 正则表达式 |
| 用来进行匹配的字符串 |
| 表示用正则表示式匹配的所有字符串 |
| 表示正则表达式中的第一个子表达式匹配的字符串 |
| 表示正则表达式中的第二个子表达式匹配的字符串 |
5.5 捕获变量
- 通过
( )
可以捕获字符;例如如何将字符串"Snow is 30 years old"
中30捕获出来?
- 一次捕获多个字符串;例如如何将字符串
“Snow is 30 years old
中Snow
和30
一次捕获?
6.文本处理
用TCL处理文本在工作中十分常用,主要掌握以下三个指令open
、gets
、close
6.1 open
- 语法格式:
open
文件
打开方式
(打开方式r
表示读
模式,w表示写模式
) - 功能:打开文件
6.2 gets
- 语法格式:
gets
fileld
变量名
- 功能:gets读
fieId标识的文件的下一行
,并把该行赋给变量,并返回该行的字符数(文件尾返回-1)
6.3 close
- 语法格式:
close
fileid
- 功能:关闭文件
6.4 举例
6.4.1 例1
6.4.2 例2
6.4.3 例3
- 写一TCL脚本求出所有Slack值之和