Tcl教程1
文章目录1、Tcl基本语法2、Tcl命令结构:命令替换变量替换反斜杠替换(转义替换)3、Tcl数据类型简单Tcl对象字符串表示列表 List关联数组句柄4、tcl变量变量命名动态类型数学表达式5、Tcl运算符算数运算符关系运算符逻辑运算符位运算符三元运算符运算符优先级6、Tcl决策?:操作符if语句 / if ... else 语句switch 语句内嵌switch语句7、Tcl 循环while
参考:https://www.yiibai.com/tcl/tcl_commands.html
1、Tcl基本语法
# 单行注释,行内注释(注意行内注释有;)
puts "Hello, world!" ;#输出
#运行.tcl命令
$tclsh test.tcl
#多行注释
if 0 {
my first program in Tcl program
It is simple
}
puts "Hello!"
标识符:以字母或_开头,包括$、数字(大小写敏感)
保留字:内置变量,不能
Tcl空格:空格分开一个声明的一个组成部分
2、Tcl命令
结构:
词语的列表,第一个词为command name,随后的单词代表参数,多个单词可用 ”“ 或 {}
# commandName argument1 argument2 ... argumentN
# 标准输出设备打印程序
puts stdout "Hello World!"
命令替换
[] 用来计算在 [] 内的脚本
# 结果为16
puts [expr 1 + 6 + 9]
变量替换
$ 用在变量名之前,将返回该变量的内容
set a 3
puts $a
# 结果是 3
反斜杠替换(转义替换)
转义字符/序列的结果
puts "Hello\nWorld"
# 结果为
Hello
World
3、Tcl数据类型
简单Tcl对象
变量不用声明,直接赋值
变量没有默认值,使用前必须赋值
set myVariable 18
puts $myVariable
# 结果
18
puts [expr $myVariable + 6 + 9]
#结果
33
字符串表示
一个字符串不需要 ”“
多个字符串用 ”“ 或 {}
set myVariable hello
set myVariable1 "hello world"
set myVariable2 {hello world}
获取字符串后缀
在Tcl中,获取字符串的后缀可以使用字符串切片功能。
# eg: 获取文件名后缀
set str "example.txt"
set suffix [string range $str [expr [string last "." $str] + 1] end]
puts $suffix
想要获取文件名的后缀。
(1)string last命令查找最后一个点的位置
(2)通过string range命令从这个位置的下一个字符开始取到字符串末尾。
(3)$suffix就包含了文件的后缀名,例如txt。
列表 List
一组元素的列表,用 ”“ 或 {}
set myVariable {reg green yellow}
puts [lindex $myVariabel 2]
# 结果
yellow
set myVariable1 "blue black white"
puts [lindex $myVariable1 1]
#结果
black
关联数组
关联数组的索引(key)不一定是整数
set marks(english) 80
puts $marks(english)
# 结果
80
句柄
tcl句柄用于表示文件和图像对象
# 创建一个文件句柄
set myfile [open "filename" r]
4、tcl变量
变量命名
变量名称可以包括任何字符和长度
set用于指定值的变量
格式:set variableName value
set variableA 10
set {variable B} test
puts $variableA
puts ${variable B}
动态类型
变量的值可以在需要时被动态地转化为所需的类型
set variableA "10"
puts $variableA
set sum [expr $variableA +20]
puts $sum
# 结果
10
30
数学表达式
expr用于数学表达式,tcl默认精度为12位
被除数和除数均是整数,则结果为整数
被除数和除数有一个是小数,则结果为小数
set variableA "10"
set result [expr $variableA / 9]
puts $result
set result [expr $variableA / 9.0]
puts $result
set result [Expr $variableA / 9]
puts $result
# 结果
1
1.1111111111111112
1.1111111111111112
改变数据精度
set variableA "10"
set tcl_precision 5
set result [expr $variableA / 9.0]
puts $result
# 结果
1.1111
set_app_var 和 set
参考:在 dc tcl 中 set_app_var 与 set 的区别
相同:dc_shell 中 set 和 set_app_var 功能都是设置变量的值
区别:
(1)set 用来设置 Tcl global variable,即全局变量的值
(2)set_app_var 用来设置 application variable, 即应用内部的变量值
当用 set_app_var 的值不存在时,会报告错误,同时转而使用 set 设置该变量
Error: Variable 'xxx' is not an application variable. Using Tcl global variable. (CMD-104)
5、Tcl运算符
算数运算符
+、-、*、/、%(求模)
set a 21
set b 10
set c [expr $a + $b]
puts "Line 1 - Value of c is $c\n"
# 结果
Line 1 - Value of c is 31
关系运算符
==、!=、>、<、>=、<=
set a 21
set b 10
if { $a == $b } {
puts "Line 1 - a is equal to b\n"
} else {
puts "Line 1 - a is not equal to b\n"
}
逻辑运算符
&&、||、!
set a 5
set b 20
if { $a && $b } {
puts "Line 1 - Condition is true\n"
}
位运算符
适用于位,进行逐位操作
&、|、^(异或)、<<、>>
set A 10011
set b {expr $A << 2}
三元运算符
?:
set a 10
set b [expr $a == 1 ? 20:30]
puts "Value of b is $b\n"
# 结果
Value of b is 30
运算符优先级
分类 | 运算符 | 关联 |
---|---|---|
Unary | + - | right to left |
Multiplicative | * / % | left to right |
Additive | + - | left to right |
Shift | <<、>> | left to right |
Relational | <、<=、>、>= | left to right |
Bitwise AND | & | left to right |
Bitwise XOR | ^ | left to right |
Bitwise OR | | | left to right |
Logical AND | && | left to right |
Logical OR | || | left to right |
Ternary | ?: | right to left |
set a 20
set b 10
set c 15
set d 5
set e [expr [expr $a + $b] * $c / $d]
puts "Value of (a + b) * c / d is : $e\n"
#结果
Value of (a + b) * c / d is : 90
6、Tcl决策
需要指定一个或多个条件进行评估,或由程序进行测试,如果条件被确定为真,执行对应code,否则执行另外code
下图为典型决策结构的一般形式:
?:操作符
形式:Exp1?Exp2:Exp3;
set a 10
set b [expr $a == 1 ? 20 : 30]
puts "Value of b is $b\n"
# result
Value of b is 30
if语句 / if … else 语句
set a 10
if { $a < 20 } {
puts "a is less than 20"
} elseif { $a == 20} {
puts "a is equal to 20"
} else {
puts "a is not less than 20"
}
puts "value of a is : $a"
if exists
参考:TCL脚本之if判断存在
(1) 判断变量是否存在
if { ![info exists DESIGN_TOP] || $design_dir != "" } {
echo "Top design not found"
}
# [info exists varName]: 如果变量之前定义过,返回1;否则,返回0
# 第一个条件返回1(真)条件下,若 design_dir 变量的值不为空,则整个表达式为 true
(2)判断文件是否存在
if { [file exists ./output/top.c] } {
source ./output/top.c
}
# [file exists File_path]: 判断路径下的指定文件是否存在。若存在,返回1(true);否则,返回0(false)
(3)判断目录是否存在
if { [file isdirectory ./output] } {
echo "Output dir is ./output"
} else {
sh mkdir output
echo "create output dir as ./output"
}
# [file isdirectory dir_name]: 判断路径目录是否存在。若存在,返回1(true);否则,返回0(false)
(4) 判断数组
set name_list(0) Tom
set name_list(1) John
if { [array exists name_list] } { # [array exists arr1] : arr1 数组是否存在
echo $name_list 1
}
puts $name_list(0)
# Tom
puts [array size name_list] # [array size arr1]: arr1 的元素数量
# 2
puts [array names name_list] # [array names arr1]: arr1 的索引
# 0 1
switch 语句
未加引号版本
set grade B
switch $grade A {puts "Well done!"} B {puts "Excellent"} default { puts "Invalid grade"}
puts "Your grade is $grade"
引用版本
set grade B
switch $grade {
A {
puts "Well done!"
}
B {
puts "Excellent!"
}
default {
puts "Invalid grade"
}
}
puts "Your grade is $grade"
内嵌switch语句
set a 100
set b 200
switch $a {
100 {
puts "This is part of outer switch"
switch $b {
200 {
puts "This is part of inner switch!"
}
}
}
}
puts "Exact value of a is : $a"
puts "Exact value of b is : $b"
7、Tcl 循环
while 循环
set a 10
whilt { $a < 20 } {
puts "value of a:$a"
incr a;#a自增
}
for循环
for { set a 10 } { $a < 20 } { incr a } {
puts "value of a: $a"
}
内嵌循环
set j 0;
for { set i 2} { $i < 100 } {incr i} {
for {set j 2} { $j < [expr $i / $j]} {incr j} {
if{ [expr $i % $j] == 0 } {
break
}
}
if { $j > [expr $i /$j]} {
puts "$i is prime"
}
}
循环控制语句
break语句
退出整个循环
continue语句
中止当前循环,跳到下一次循环
set a 10
while { $a < 20 } {
if { $a == 15 } {
incr a
continue
}
puts "value of a : $a"
incr a
}
无限循环
while {1} {
puts "This loop will run forever"
}
Ctrl + C 终止无限循环
8、Tcl 数组
数组是一组使用索引对应元素的排列方式
语法:set ArrayName(Index) value
创建数组
set language(0) Tcl
set language(1) "C Language"
puts $languages(0)
puts $languages(1)
数组大小
计算数组大小:[array size variablename]
set languages(0) Tcl
set languages(1) "C Language"
puts [array size languages]
数组迭代
数组索引可以是非连续的
如果数组索引是连续的,可以通过数组迭代访问数组的元素。
set languages(0) Tcl
set languages(1) "C Language"
for { set index 0 } { $index < [array size languages ]} { incr index } {
puts "languages($index) : $languages($index)"
}
#result
languages(0) : Tcl
languages(1) : C Language
关联数组(键-值对)
关联数组使用索引,但不一定都是数字
set personA(Name) "Dave"
set personA(Age) 14
puts $personA(Name)
puts $personA(Age)
#result
Dave
14
数组的索引
用于检索数组索引,语法:[array names variableName]
set personA(Name) "Dave"
set personA(Age) 14
puts [array names personA]
# result
Age Name
关联数组迭代
可以使用数组的索引来遍历数组
set personA(Name) "Dave"
set personA(Age) 14
foreach index [array names personA] {
puts "personA($index) : $personA($index)"
}
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)