概述
如何启动TCL
Linux系统:
1、输入tcshl
2、在文本第一行“#/user/bin/tclsh"(TCL安装路径)
置换
TCL解释器运用规则吧命令分为一个个独立的单词,同时进行必要的置换。
TCL置换分为以下三类:
1、变量置换 $
2、命令置换 []
3、反斜杠置换 \
1、用$表示变量置换:TCL解释器会将认为$后面为变量名,将变量置换为它的值。
% set a "snow"
snow
% puts a
a
% puts $a
snow
2、用[]表示命令置换:[]内是一个独立的TCL语句。
% set a [expr 3+4]
7
% puts $a
7
3、用\表示反斜杠置换:换行符、空格、[、$、等被TCL解器当作特殊符号对待的字符,加上反斜杠后变为普通字符。
% set x 2
2
% set y 0.5
0.5
% puts "[expr $x+$y]"
2.5
% puts "\[expr \$x+\$y\]"
[expr $x+$y]
4、其他符号
“”TCL解释器对双引号中$和[]符号会进行变变量置换和命令置换。
{}而大括号中所有的特殊字符都将视为普通字符,TCL解释器不会对其做特殊处理。
#表示注释。
% puts "\[expr \$x+\$y\]"
[expr $x+$y]
% puts "\t[expr $x+$y]"
2.5
% puts {\t[expr $x+$y]}
\t[expr $x+$y]
变量、数组、列表
变量
定义: set 变量名 变量值
取值:$变量名
% set a "snow"
snow
% puts $a
snow
% set a "hello"
hello
% puts $a
hello
% set a 1
1
% puts ${a}_2
1_2
数组
定义: set 数组名(元素名) 值
取值:$数组名(元素名)
% set cell_1(ref_name) "bufx2"
bufx2
% set cell_1(full_name) "top/cell_1"
top/cell_1
% set cell_1(pins) "a b c"
a b c
% puts $cell_1
can't read "cell_1": variable is array
% puts $cell_1()
can't read "cell_1()": no such element in array
% puts $cell_1(ref_name)
bufx2
% array size cell_1
3
% array names cell_1
ref_name pins full_name
列表:列表是标量的有序集合。
定义: set 列表名{元素1 元素2 元素3}
取值:$列表名
% set list {ivtx2 ivxt4 ivxt8}
ivtx2 ivxt4 ivxt8
% puts $list
ivtx2 ivxt4 ivxt8
TCL中常用列表的操作命令
命令 | 功能 |
---|---|
concat | 合并两个列表 |
lindex | 选取列表中的某个元素 |
llength | 列表长度 |
lappend | 在列表末端追加元素 |
lsort (默认ACCII码排序, 参数-real按照数值大小排序, -unique唯一化,删除重复元素) | 列表排序 |
% set list {ivtx2 ivxt4 ivxt8}
ivtx2 ivxt4 ivxt8
% puts $list
ivtx2 ivxt4 ivxt8
% set list2 {buff1 buff2 buff3}
buff1 buff2 buff3
% concat $list $list2
ivtx2 ivxt4 ivxt8 buff1 buff2 buff3
% llength $list
3
% llength $list
3
% llength [concat $list $list2]
6
% lindex $list2 2
buff3
获取列表最后一个元素
set list1 {a b c d e f}
a b c d e f
% lindex $list1 [expr [llength $list1]-1]
f
% set list1 {a b c d e f}
a b c d e f
% lappend list1 g
a b c d e f g
% set list2 {1 2}
1 2
% lappend list1 $list2
a b c d e f g {1 2}
% expr 5/2
2
% expr 5/2.0
2.5
% expr 5.0/2
2.5
控制流
控制流 if
语法:
if{判断条件}{
脚本语句
}elseif{判断条件}{
脚本语句
}else{
脚本语句
}
set list1 {0 1 2 3 4}
set length [llength $list1]
if {$length > 3} {
puts "the length of list1 larger than 3"
} elseif {$length = 3} {
puts "the length of list1 equal 3"
} else {
puts "the length of list1 less than 3"
}
the length of list1 larger than 3
一定要注意if elesif else中间的空格
循环指令 foreach
语法格式:foreach 变量 列表 循环主体
功能:从第0个元素开始,每次按顺序取得列表一个元素,将其值赋给变量,然后执行循环主体一次,直到列表最后一个元素。
set list1 {0 1 2 3 4}
foreach i $list1 {
puts $i
}
0
1
2
3
4
循环控制指令 break
语法格式:berak
功能:结束整个循环过程,并从循环中跳出。
set list1 {0 1 2 3 4}
foreach i $list1 {
if {$i == 2} {
break
}
puts $i
}
0
1
循环控制指令 continue
语法格式:continue
功能:仅结束本次循环
set list1 {0 1 2 3 4}
foreach i $list1 {
if {$i == 2} {
continue
}
puts $i
}
0
1
3
4
循环控制指令 while
语法格式:while 判断条件语句 循环主体
功能:如果判断语句成立,就运行脚本,直到不满足判断条件为止停止循环。
set i 3
while {$i > 0} {
puts $i
incr i -1; #set i [expr $i + -1] incr 整数加法,有小数点不支持
}
3
2
1
循环控制指令 for
语法格式:for 参数初始化 判断语句 参数改变语句 循环主题
for {set i 3} {$i > 0} {incr i -1} {
puts $i
}
3
2
1
过程函数
过程函数 proc
语法格式:proc 函数名 参数列表 函数主体
功能:类似于C语言的函数。即用户自定义的功能,方便调用。
proc add {a b} {
set sum [expr $a + $b]
return $sum
}
set sum [add 4 6] #puts [add 4 6]
puts $sum
10
全局变量于局部变量
全局变量:在所有过程之外的变量
局部变量:对于在过程中定义的变量,因为他们只能在过程中被访问,并且当过程退出时会被自动删除。
指令:global
set a 1
proc sample {x} {
global a
set a [expr $a + 1]
return [expr $a + $x]
}
puts [sample 3]
5
set a 1
proc sample {x} {
set a [expr $a + 1]
return [expr $a + $x]
}
puts [sample 3]
Error: can't read "a": no such variable
正则匹配
特殊字符含义及其功能
表达式 | 功能 | 举例 |
---|---|---|
\w | 用来匹配一个字母,数字、下划线 | abc123:\w\w\w\d\d\d |
\d | 用来匹配一个数字 | abc123:\w\w\w\d\d\d |
* | 零次或多次匹配 | |
+ | 一次或者多次匹配 | abc123:\w+\d+ |
? | 零次或一次匹配 | |
^ | 字符串开头 | |
$ | 字符串结尾 | |
\s | 表示空格 | |
.(点) | 表示任意一个字符 |
正则匹配指令 regexp
语法格式:regexp?switches?exp string?match Var? ?subMatch Var
功能: 在字符串使用正则表达式匹配。
switches:
-nocase将字符串中的大写都当成小写看待。
exp 正则表达式
string 用来进行匹配的字符串
matchstring 表示用正则表达式匹配的所有字符串
sub1表示正则表达式中的第一个子表达式匹配的字符串
sub1表示正则表达式中的第一个子表达式匹配的字符串
regexp exp string
匹配字符串“abc456”
regexp {\w+\d+} "abc456" var
匹配一个以数字开头并且以数字结尾的字符串
regexp {^\d.*\d$} "1 sgsg 2" var
通过()可以捕获字符串
例:将字符串“Snow is 30 yeard old" 中的30捕获出来
regexp {\s(\d+).*} "Snow is 30 yeard old" total age
puts $total
puts $age
30 yeard old
30
regexp {^(\w+)\s\w+\s(\d+).*} "Snow is 30 yeard old" total name age
puts $total
puts $name
puts $age
Snow is 30 yeard old
Snow
30
文本处理
open指令
语法格式:open 文件 打开方式 (打开方式 r 表示读模式,w 表示写模式。)
功能:打开
gets指令
语法格式:gets fileld 变量名
功能:gets 读fileld标识的文件的下一行,并把该行赋给变量,并返回该行的字符数(文件结尾返回 -1)。
close指令
语法格式 close fileld
功能: 关闭文件
读取文件
set inputfile [open file.txt r]
while {[gets $inputfile line] >=0} {
puts "$line"
}
close $inputfile
写入文件
set outputfile [open file.txt w]
puts $outputfile "hello world"
close $outputfile
例题
文本累加
Slack = -0.051
Slack = -0.234
Slack = -0.311
Slack = -0.056
Slack = -0.434
Slack = -0.316
Slack = -0.151
Slack = -0.524
set inputfile [open 1.txt r]
set sum 0
while {[gets $inputfile line] >=0} {
if {[regexp {=\s(.\d\.\d+)} $line total num]} {
set sum [expr $sum + $num]
}
}
close $inputfile
puts "$sum"
-2.077