tcl基础知识


写于2021-12-03 19:08

该文章最初的目的只是为了记录我个人的学习笔记,所以有些地方可能写得不是很清楚,请大家见谅!
有问题或者有补充的地方可在评论区留言!!!

总概括:在tcl中,一切皆字符串

第一章 Tcl基础知识

变量命名规则:没有任何限制,分区大小写

Tcl对命令的求值过程:解析执行
解析:把命令拆分为一个个独立的单词,同时进行必要的置换。
执行:把第一个单词作为命令,其余单词作为参数,并检查是否满足该命令要求,不满足要求将错误信息保存在全局变量errorInfo中。

Tcl命令构成:命令名 参数1 参数2 ... 参数N
Tcl三类置换:变量置换命令置换反斜线置换
Tcl三种注释方法:if,花括号proc

Tcl会把"-"、"."当作分隔符,所以变量名有"-"时,变量置换通过"{}"括起来({a-b-c})

  1. 在采用分号作为命令之间的分隔符时,分号左侧命令不会显示输出结果(set a 6;set b 9 只会显示9)
  2. incr命令后的两个参数都必须是整型数据
  3. $varset var等效
  4. 在同时使用双引号和花括号时,最外层的起主导作用

第二章(表达式)

算术操作符

  1. 对于a/ba%b,结果满足a=q*b+r,且0<<|r|<|b| ,r与q同符号。

Tcl常用函数

  1. abs(x)fmod(x,y)(x除以y的余数)、max(x)min(x)pow(x,y)sqrt(x)round(x)(对x进行四舍五入得到的整型值)、rand()(产生在[0,1]区间的伪随机浮点数)srand(x)(使用整数种子x重设随机数生成器)
  2. bool(x)double(x)int(x)

第三章 字符串

  1. string repeat可以指定字符串的重复次数
string repeat a 5
=>aaaaa
  1. string is用来判断字符类型,例:string is ascii 32

  2. string length获取字符串中字符个数,

  3. string index可以通过索引返回一个字符,可以使用end作为字符串中最后一个字符的索引值,例:string index $str end-1,end加减i中间不能出现空格;

  4. string range返回由两个索引值范围内的所有字符,例:string range $str end-2 end

  5. append直接修改原始变量的值,没有新创建变量,例:

set str hello
set v tcl
apped str $v
puts $str
=>hello tcl
  1. string replace删除指定索引内的字符,但并不会修改原始字符串变量的值,例:string replace $str end-2 end "hello tcl"

  2. string comparestring equaleq==进行两个字符串比较,区分大小写,如果不区分,需要添加-nocase参数,-length i限定只对前i个字符进行判断,例:string equal -length 3 hello Hello

  3. string firststring last搜索字符串,例:string first th $str 10

  4. string match用于通配符样式匹配,例:string match t* tcl

命令 功能
string repeat 把指定字符串重复指定次数
string is 判定字符串是否为指定类型
string length 可获取字符串中字符的个数
string index 根据索引值获取字符
string range 根据索引区间获取字符
append 在字符串末尾添加新的字符串
string replace 根据索引区间删除或替换字符
string compare 对两个字符串进行比较
string equal 判断两个字符串是否相等
string frist 从字符串头部至字符串尾部搜索与指定字符串相同的子字符串
string last 从字符串尾部至字符串头部搜索与指定字符串相同的子字符串
string match 用于通配符样式的匹配
format 将字符串按照指定格式显示
string totitle 将字符串转换为标题形式
string toupper 将字符串中的小写字母转换为大写字母
string tolower 将字符串中的大写字母转换为小写字母
string trim 去除字符串开头和结尾处的裁剪字符
string trimleft 只去除字符串开头处的裁剪字符
string trimright 只去除字符串结尾处的裁剪字符

第四章 列表

命令 功能 语法
list 创建列表 list后直接跟随列表元素
concat 拼接多个列表,合成一个新的列表 concat后可以跟随一个或多个列表
lrepeat 通过重复元素集合的方式创建列表 lrepeat+重复次数+重复元素
llength 获取列表长度(列表中的元素个数) llength+列表名
lindex 根据索引值获取列表长度 lindex+列表名+索引参数
lrange 获取索引值指定范围内的列表长度 lrange+列表+第一个索引值+第二个索引值
lassign 获取列表元素,并将其分配给指定变量 lassign+列表+变量名
lappend 向列表末尾添加新元素 lappend+列表名(不加$符号)+新加的元素
linsert 向列表的指定位置添加新元素 linsert+列表+新元素的起始索引+新元素(原列表没有改动)
lerplace 删除或替换索引值指定范围内的列表元素 lreplace+列表+待删除元素起始索引+终止元素索引
lset 替换索引值指定位置上的列表元素 lset+列表名(不加$符号)+替换索引+替换值
lsearch 根据搜索模式和匹配模式查找目标列表元素 lsearch+列表+匹配模式(-glob、-exact、regexp)
lsort 对列表元素进行排序 lsort+(-ascii -increasing or -decreasing、-integer、-real、-unique、-index)
split 根据分割字符分割字符串,并创建列表 split+字符串变量+分割字符
join 把列表元素串接成一个字符串 join+列表+分割字符
foreach 遍历列表元素,执行循环脚本 foreach+变量名+列表+构成循环体的tcl脚本

第五章 数组

构成数组的三个要素:数组名+元素+值

命令 功能 语法
array exists 判定数组是否已创建,若创建,返回1否则返回0 array exists + 数组名
array size 获取数组大小 array size + 数组名
array set 创建数组 array set + 数组名 + 数组元素
array names 获取数组的元素名列表 array names + 数组名
array get 获取数组的“元素名 值”列表 array get + 数组名
parray 输出数组元素 parray + 数组名
array unset 删除数组 array unset + 数组名

第六章 流程控制

  1. if 命令规定每一个左花括号都必须与它的前一个字符同行
  2. else只是if命令的可选子句,在使用时,要将其与if中第二个参数的右花括号放在同一行,而不能另起一行(elseif也如此)
  3. 在使用switch命令时,可通过短画线“-”将相同脚本的不同匹配模式捆绑在一起,使代码更简洁。
  4. 在switch中添加注释时,应该把注释写在匹配模式对应的脚本中
switch模式匹配方式 含义
-exact 严格的字符串比较
-glob sting match命令下的匹配
-regexp 正则表达式匹配

第七章 过程

总结:

  1. 参数名在参数名列表中的顺序是:无默认值的参数名带默认值的参数名特殊参数名args,args一定要位于最后;
  2. return 可使用-code参数返回额外的信息;
  3. 在过程中使用全局变量,可以使用global命令实现,一旦调用,一直生效直到过程返回;
  4. 全局变量可通过局部变量的引用来更新upvar X y,X为全局变量,y为局部变量;
  5. 无论所处多少层级,都可通过#0的形式表明访问的变量为全局变量。
命令 功能 语法
proc 跟随三个参数,即过程名、参数名列表和过程块
过程的参数名列表 参数名列表可以为空,参数可以带默认值,也可以带特殊参数args
过程的返回值 可以由return返回,若返回多个值,可以将其放入列表中一次返回
局部变量与全局变量 过程块内为局部变量,过程块外为全局变量
global 在过程块内用global命令指明该变量为全局变量
upvar 三个应用场景:模拟引用;过程块访问数组;给变量起别名
info level 返回当前层级信息

第八章 命名空间

总结:
1. variable创建命名空间变量,并对其初始化,每个过程内都需要再次写variable+变量名;但是如果变量是数组,必须使用array set进行数组的初始化。
2. 变量作用域:·全局变量>命名空间变量>局部变量
3.命名空间变量不可以向下传递

命令 功能 语法
namespace eval 创建命名空间
namespace children 返回指定命名空间的子空间
namespace parent 返回指定命名空间的父空间
namespace exists 确定命名空间是否存在
namespace qualifiers 返回参数中最后一个命名空间分隔符之前的所有字符
namespace tail 返回参数中最后一个命名空间分隔符之后的所有字符
namespace delete 删除指定的命名空间
variable 创建命名空间变量,并对其初始化,也可在过程中使用该命令引用命名空间变量
namespace current 返回当前命名空间名称
namespace upvar 引用指定命名空间中的命名空间变量
namespace export 导出命名空间中的命令
namespace import 导入命名空间中的命令
namespace forget 遗忘在指定的命名空间
info command 返回指定命名空间包含的所有命名
namespace origin 返回导入命令的原始来源
namespace ensemble create 创建集合命令

第九章 访问文件

总结:
1. file delete删除非空目录,需要加参数-force,会递归删除,需谨慎使用;
2. file copy复制的文件如果已存在会报错,想覆盖可加-force,可同时复制多个文件;
3. file rename目标文件已存在会报错,想覆盖可加-force
4. glob没有匹配到文件会报错,不让报错可加-nocomplain
5. puts-nonewline可阻止写入的文件换行;
6. file stat可一次性得到文件的各种信息,例:file stat readme.txt finfo,finfo是一个数组,用以储存文件信息。查看信息:parray finfoputs $finfo[atime]

命令 功能 语法
file dirname 返回文件的绝对路径不含文件名
file extension 返回文件的扩展名
file nativename 返回原生格式的文件名
file rootname 返回文件名除扩展名之外的部分
file tail 返回文件的最后一个部分,即最后一个子目录下的文件名称
file split 将文件名按正斜线“/”所在位置进行分割,并返回各部分字符串
file join 将给定字符串拼接为文件路径
pwd 打印当前工作目录
cd 切换当前工作目录到指定目录
glob 根据模式获取当前工作目录下的内容
file mkdir 在当前工作目录下创建一个新的目录
file delete 删除指定的文件或目录
file copy 可将源文件复制到目标文件
file rename 为指定的文件或目录重新命名
file exists 查看文件或目录是否存在
file isfile 判断指定的内容是否为文件
file isdirectory 判断指定的内容是否为目录
file type 查看指定内容的类型
file readable 当指定文件存在且用户有读权限时返回1,否则返回0
file writable 当指定文件存在且用户有写权限时返回1,否则返回0
file executable 当指定文件存在且用户有运行权限时返回1,否则返回0
file stat 可一次性得到文件的各种信息
open 根据指定模式打开文件
read 读取文件内容
close 关闭文件
file size 获取文件大小(以字节为单位)
gets 获取文件行内容
eof 读取到文件末尾,该命令返回1
csv::split 根据分隔符分割csv格式的内容
csv::read2matrix 将csv文件内容读取到矩阵中
csv::read2queue 奖csv文件内容读取到队列中
csv::join 将列表元素按照分隔符拼接为csv格式的内容
csv::joinlist 将嵌套列表按照分隔符拼接为csv格式的内容