Tcl教程1


参考: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

下图为典型决策结构的一般形式:

Decision Making

?:操作符

形式: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)"
}
  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值