tcl入门,方便查找
笔记内容来自哔哩哔哩"讲芯片的邸老师"
1、概述
脚本解释器
#!/user/bin/tclsh
置换
变量置换$
设置变量a为snow
set a "snow"
puts $a #打印snow
puts a #打印 a
命令置换[]
[]内解释器认为是独立的tcl语句
set a [expr 3+4] #计算3+4
puts $a #打印7
反斜杠置换\
所有具有特殊作用的符号,加上\后解释器认作普通符号
puts "[expr $x + $y]" #打印x值+y值的具体值
puts “\[expr $x + $y]” #打印字符串[expr $x + $y]
花括号{}
花括号内所有特殊字符被当作普通字符处理
2、变量、数组、列表
变量
set a 2
puts ${a}_1
puts $a_1#这种是错误写法
数组
set 数组名(元素名) “值” #声明数组
puts $数组名(元素名)#引用数组
array size 数组名 #获取数组元素个数
array names 数组名 #获取数组元素名
列表
set list_name {元素1 元素2 元素3}
puts $list_name
列表操作命令
命令 | 功能 |
---|---|
concat | 合并两个列表 |
lindex | 选取列表中某个元素 |
llength | 列表长度 |
lappend | 在列表末端追加元素 |
lsort | 列表排序 |
set list1 {bufx1 bufx2 bufx4}
set list2 {ivtx1 ivtx2 ivtx4}
concat $list1 $list2
llength $list1
llength [concat $list1 $list2]
lindex $list1 [expr [llength $list1] -1]
lappend list1 bufx8#注意,这里list1前面不用加$
lappend list1 $list2 #把list2整体当作元素追加在list1后边
set $list1 {c,d,a,f,f,b}
lsort $list1#默认按照asicc码排序,结果为abcdff
set $list2 {-2,3.1,5,0}
lsort -real $list2#按照数字大小排序,结果为-2 0 3.1 5
lsort -unique $list1 #列表唯一化,删除重复项,结果为abcdf
运算
数学运算
+ - * /
指令 expr:将运算表达式求职
逻辑运算
<= >= == !=
3、控制流
if
set list1 {0 1 2 3 4}
set length [llength $list1]
if {$length > 3}{
puts "the length of list1 is larger than 3"
}else{
puts "the length of list1 is not larger than 3"
}
注意“{”写在上一行,否则解释器认为if语句已经结束
foreach
set list1 {1 2 3 4}
foreach i $list1{
if {$i==2}{
break
}
puts $i
}
list1的每个元素被赋给i,然后被打印,可使用break跳出foreach,也可用continue跳出本次循环
while
set i 3
while($i > 0){
puts $i
incr i -1;#等价于set i [expr $i -1]
}
for
for {set i 3}{$i >0}{incr i -1}{
puts $i
}
4、过程函数
proc
用于自定义函数
proc add {a b} {
set sum [expr $a + $b]
return $sum
}
add 3 4
变量分为过程变量和全局变量,过程变量定义在proc中,在proc中引用全局变量使用global
set a 1
proc sample {x} {
global a
set a [expr $a + 1]
return [expr $a + $x]
}
5、正则匹配
量词
\w用来匹配一个字母、数字、下划线
\d用来匹配一个数字
abc123可以用\w\w\w\d\d\d来匹配
符号 | 功能 |
---|---|
* | 零次或多次匹配 |
+ | 一次或多次匹配 |
? | 零次或一次匹配 |
上例改为\w+\d+或者\w*\d*
锚位
符号 | 功能 |
---|---|
^ | 字符串开头 |
$ | 字符串结尾 |
^\d\d\d指取出123abc123开头的123
\d\d\d$指取出123abc123结尾的123
其他字符
\s指空格
. 表示任意字符
regexp
- switches:-nocase将字符串中的大小写都看成小写
- exp正则表达式
- string用来匹配的字符串
- matchstring表示用正则表达式匹配的所有字符串
- sub1表示正则表达式中的第一个子表达式匹配的字符串
- sub2表示正则表达式中的第二个子表达式匹配的字符串
例
regexp {\w+\d+} “abc456”
regexp {^\d.*\d} "1 dfsal 1"#匹配以数字开头且以数字结尾的字符串
通过()捕获字符串
将字符串“Snow is 30 years old”中30捕获出来
regexp {\s(\d+).*} "Snow is 30 years old" total age
#此匹配会匹配出30 years old,然后存放在total中
#而括号中的内容\d+会存放在age中
将Snow和30一起捕获
regexp {^(\w+)\s\w+\s(\d+).*} "Snow is 30 years old" total name age
#name存放第一个括号里的匹配
#age存放第二个括号里的匹配
6、文本处理
读入文件
set INPUTFILE [open file.txt]#以只读模式打开file.txt
while{[gets $INPUTFILE line]>0}{
puts $line
}
close $INPUTFILE
写入文件
set OUTPUTFILE [open file.txt]
puts %OUTPUTLINE "hello world"
close $OUTPUTFILE
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律