TCL语言(基础用法)

概述

如何启动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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值