tcl基础知识
写于2021-12-03 19:08
该文章最初的目的只是为了记录我个人的学习笔记,所以有些地方可能写得不是很清楚,请大家见谅!
有问题或者有补充的地方可在评论区留言!!!
tcl解释器官方下载地址: https://www.activestate.com/products/tcl/
第一章 Tcl基础知识
总结: 在tcl中,一切皆字符串
变量命名规则:没有任何限制,分区大小写
Tcl对命令的求值过程:解析
和执行
解析
:把命令拆分为一个个独立的单词,同时进行必要的置换。
执行
:把第一个单词作为命令,其余单词作为参数,并检查是否满足该命令要求,不满足要求将错误信息保存在全局变量errorInfo中。
Tcl命令构成:命令名 参数1 参数2 ... 参数N
Tcl三类置换:变量置换
,命令置换
,反斜线置换
Tcl注释方法:if
,花括号
,proc
,#
- 在采用分号作为命令之间的分隔符时,分号左侧命令不会显示输出结果(
set a 6;set b 9
只会显示9); - incr命令后的两个参数都必须是整型数据;
$var
与set var
等效;- 在同时使用双引号和花括号时,最外层的起主导作用;
- Tcl会把"-"、"."当作分隔符,所以变量名有"-"时,变量置换通过"{}"括起来(
{a-b-c}
); \
可实现续行功能,“\”后不能跟随任何字符,包括空格和制表符。
命令 | 功能 |
---|---|
info exists | 判断变量是否存在 |
info hostname | 返回主机名 |
info tclversion | 返回tcl解释器版本信息 |
unset | 取消变量定义并释放内存空间 |
第二章 表达式
总结:
算术操作符
- 对于
a/b
和a%b
,结果满足a=q*b+r
,且0 ≤ |r| < |b|,r与q同符号。
Tcl常用函数
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重设随机数生成器)
、ceil(x)
(向上取整)、floor(x)
(向下取整);bool(x)
、double(x)
、int(x)
;- 真:
非0
、yes
、on
、true
;假:0
、no
、off
、false
; - 字符串是否相等比较:
eq
、ne
。
第三章 字符串
总结:
-
可以使用 end±i 作为字符串中最后一个字符的索引值的命令(end±i中间不允许出现空格):
string index
、string range
、string replace
,lindex
、lrange
; -
直接原地修改变量的命令(看对变量操作时是否有用“$”符号):
append
、lappend
、lset
、; -
string repeat
可以指定字符串的重复次数
string repeat a 5
=>aaaaa
append
直接修改原始变量的值,没有新创建变量,例:
set str hello
set v tcl
apped str $v
puts $str
=>hello tcl
string compare
(非判断两字符串是否严格相等)、string equal
、eq
、==
进行两个字符串比较,区分大小写,如果不区分,需要添加-nocase
参数,-length i
限定只对前i个字符进行判断,例:string equal -length 3 hello Hello
命令 | 功能 | 例 |
---|---|---|
string repeat | 把指定字符串重复指定次数 | string repeat a 5 |
string is | 判定字符串是否为指定类型 | string is ascii 32 |
string length | 可获取字符串中字符的个数 | |
string index | 根据索引值获取字符 | string index $str end-1 |
string range | 根据索引区间获取字符 | string range $str end-2 end |
append | 在字符串末尾添加新的字符串 | |
string replace | 根据索引区间删除或替换字符 | string replace $str end-2 end "hello tcl" |
string compare | 对两个字符串进行比较 | |
string equal | 判断两个字符串是否相等 | string equal -length 3 hello Hello |
string frist | 从字符串头部至字符串尾部搜索与指定字符串相同的子字符串 | string first th $str 10 |
string last | 从字符串尾部至字符串头部搜索与指定字符串相同的子字符串 | |
string match | 用于通配符样式的匹配 | string match t* tcl |
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+列表+新元素的起始索引+新元素(原列表没有改动) |
lreplace | 删除或替换索引值指定范围内的列表元素 | 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 + 数组名 |
第六章 流程控制
总结:
- if 命令规定每一个左花括号都必须与它的前一个字符同行
- else只是if命令的可选子句,在使用时,要将其与if中第二个参数的右花括号放在同一行,而不能另起一行(elseif也如此)
- 在使用switch命令时,可通过短画线“-”将相同脚本的不同匹配模式捆绑在一起,使代码更简洁。
- 在switch中添加注释时,应该把注释写在匹配模式对应的脚本中
switch模式匹配方式 | 含义 |
---|---|
-exact | 严格的字符串比较 |
-glob | sting match命令下的匹配 |
-regexp | 正则表达式匹配 |
第七章 过程
总结:
- 参数名在参数名列表中的顺序是:
无默认值的参数名
、带默认值的参数名
、特殊参数名args
,args一定要位于最后; return
可使用-code
参数返回额外的信息;- 在过程中使用全局变量,可以使用
global
命令实现,一旦调用,一直生效直到过程返回; - 全局变量可通过局部变量的引用来更新
upvar X y
,X为全局变量,y为局部变量; - 无论所处多少层级,都可通过
#0
的形式表明访问的变量为全局变量; - 有特殊参数
args
时,会把剩余参数当作一个列表传入过程。
命令 | 功能 | 语法 |
---|---|---|
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 finfo
、puts $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格式的内容 |
本文来自博客园,作者:27岁的太阳,转载请注明原文链接:https://www.cnblogs.com/isxjj/p/15567041.html