admin 管理员组文章数量: 887042
2024年1月9日发(作者:很仙气古风的边框手绘)
TCL基本语法
1 语言简介
TCL缩短工具命令语言的形式。由加州大学伯克利分校的约翰Ousterhout设计它。它是一种脚本语言,由其自身的解释器,它被嵌入到开发应用程序的组合。
TCL最初在Unix平台中。后来移植到Windows,DOS,OS/2和Mac OSX。 TCL非常类似于其他UNIX的shell语言,类似Bourne Shell (Sh), the C Shell (csh), the Korn Shell (sh), 和 Perl。
它的目的是提供程序与其他程序,也是作为一个可嵌入的翻译相互作用的能力。虽然原来的目的是为了使程序能够进行交互,可以找到由Tcl/Tk 编写的完全成熟的应用。
1.1 TCL特性
TCL的特点如下:
1、减少开发时间。
2、功能强大和简单的用户界面工具包整合传统知识。
3、一次编写,随处运行。它可以运行在Windows,Mac OS X和几乎所有的Unix平台。
4、有经验的程序员很容易上手,因为语言就是这么简单,可以在几个小时或几天学习Tcl就可以搞定。
5、可以轻松地用Tcl扩展现有的应用程序。另外,也可以包括Tcl的用C,C++或Java来扩展Tcl,或反之亦然。
6、有一组功能强大的网络功能。
7、最后,它的开源,免费的,可以用于其他无任何限制商业应用。
2 基本语法
2.1 命令结构
commandName空格arguments。每条命令之间通过换行或者;隔开。例如:
#设置变量foo为0
set foo 0
set bar 1;puts $bar; #设置(set 为一个Tcl命令)变量bar为1,输出(puts也是一个Tcl命令)bar
2.2 注释
使用#注释,不过要注意的是下面的注释是错误的:
set foo 0 #设置变量foo为0,这种注释是错误的
因为tcl解析器总是认为一条命令应该以换行或者分号结束,其他的在同一行中都认为是参数。所以正确的应该是:
set foo 0
#设置变量foo为0,这种注释是正确的
set foo 0; #设置变量foo为0,这种注释是正确的
3 变量定义及基本操作
tcl可以定义两种类型的变量:变量和数组。
3.1 变量
1、在tcl变量不需要声明就可以直接赋值。给变量赋值的例子:
set foo 0;
set foo “zero is 0”; #加引号的作用是为了告诉编译器包括空格
2、取得变量的值可以在对应的变量名前面加$来取得,例如:
puts $foo; #表示打印foo的值
3.2 数组
1、数组也不需要声明,直接赋值,例如:
set arr(0) 0;
set arr(1) 1;
一个比较有意思的地方是数组下标可以不按照顺序来写,也不一定是数字,可以是字符串。例如:
set arr(3) a;
set arr(num) b;
当然tcl数组也支持多维数组,声明形式为:
set arrs(1,1,1,1,1) a; #随便多少维
2、可以使用puts $arr(3);的形式来获得数组某个元素的内容,也可以使用parray命令:
parray arr; #将打印出arr数组所有元素内容
4 变量高级操作
4.1 字符串操作
string命令基本语法如下(这里的string1,string2可以是字符串也可以是变量,option是下列选项之一)
string option string1 string2;
option的操作选项:
compare 按照字典的排序方式进行比较。根据string1 <,=,>string2分别返回-1,0,1
first 返回string2中第一次出现string1的位置,如果没有出现string1则返回-1
last 和first相反
trim 从string1中删除开头和结尾的出现在string2中的字符
tolower 返回string1中的所有字符被转换为小写字符后的新字符串
toupper 返回string1中的所有字符串转换为大写后的字符串
length 返回string1的长度
例子:
set str “hello world!”
string length $str; #将返回变量str的长度
4.2 数字操作
因为tcl中只有一个string类型的变量,所以当要操作数字进行运算的时候,tcl提供了incr和expr两个操作命令。
1、incr的基本用法为:
incr variable integer(variable必须为数字)
例如我要将一个数字加3
set a 3;
incr a 3; #将a加3,如果要减3,则为 incr a -3;
默认的incr a等同于a++的意思,即本身自增1。
2、expr的基本语法为:
expr function number
expr是为了提供更加复杂的操作而设计的一个语法,比如运算乘除法等等。在执行算术操作的时候必须将expr命令放在算术操作之前。例如:
set a 20; set b 4;
set c [expr $a/$b]; #此时的c的值为5
#当[]出现在一组命令中,Tcl把中括号之间的所有语句当做一组Tcl命令。Tcl对这组命令进行解释,并用结果代替[]之间的文字。
除此之外,expr还能够识别一些函数及其返回值如下:
abs(x) x的绝对值
round(x) x舍入后得到的整数值
sin(x) x的正弦
…………………………………
举个例子:
set a [expr sin(0.3)]; #计算0.3的正弦
5 运算符
运算符是一个符号,告诉编译器执行特定的数学或逻辑操作。 Tcl语言有丰富的内置运算符,运算符提供的以下几种类型:算术运算符、关系运算符、逻辑运算符、位运算符、三元运算符。
5.1 算数运算符
下表列出了所有Tcl语言支持的算术运算符。假设变量A=10,变量B=20,则:
运算符
+
-
*
/
%
描述
两个操作数相加
第一个操作数减去第二个操作数
两个操作数相乘
第一个操作数除以第二个操作数
模运算即整数除法后的余数
实例
A + B = 30
A - B = -10
A * B = 200
B / A = 2
B % A = 0
若想得到小数,至少有一个操作数为小数,如:set A 10.0;
5.2 关系运算符
下表列出了所有Tcl语言支持的关系运算符。假设变量A=10,以及变量B=20,则:
运算符
==
!=
>
<
>=
描述
检查两个操作数的值是否相等,如果是的话那么条件为真
检查两个操作数的值是否相等,如果值不相等,则条件为真
检查左边的操作数的值是否大于右操作数的值,如果是的话那么条件为真
检查左边的操作数的值是否小于右操作数的值,如果是的话那么条件为真
检查左边的操作数的值是否大于或等于右操作数的值,如果是的话那么条件为真
检查左边的操作数的值是否小于或等于右操作数的值,如果是的话那么条件为真
实例
(A == B) 不为true
(A != B) 为true
(A > B) 不为true
(A < B) 为true
(A >= B) 不为true
<=
(A <= B) 为true
5.3 逻辑运算符
下表列出了所有Tcl语言支持的逻辑运算符。假设变量A=1和变量B=0,则:
运算符
&&
||
!
描述
所谓逻辑与操作。如果两个操作数都非零,则条件变为真
所谓的逻辑或操作。如果任何两个操作数是非零,则条件变为真
所谓逻辑非运算符。使用反转操作数的逻辑状态。如果条件为真,那么逻辑非运算符为假
实例
(A && B) 为false
(A || B) 为true
!(A && B) 为true
5.4 位运算符
位运算符适用于位并进行逐位操作。&, |, 和 ^ 的真值表如下:
p
0
0
1
1
q
0
1
1
0
p & q
0
0
1
0
p | q
0
1
1
1
p ^ q
0
1
0
1
假设,如果A =60;且B =13;现在以二进制格式它们将如下:
A = 0011 1100
B = 0000 1101
-----------------
A&B = 0000 1100
A|B = 0011 1101
A^B = 0011 0001
通过Tcl语言支持位运算符列在下表中。假设变量A=60和变量B=13,则:
运算符
&
|
^
<<
>>
描述
二进制和操作符副本位的结果,如果它存在于两个操作数。
二进制或操作拷贝位,如果它存在一个操作数中。
二进制异或操作符的副本,如果它被设置在一个操作数而不是两个比特。
二进制左移位运算符。左边的操作数的值向左移动由右操作数指定的位数。
例子
(A & B) = 12, 也就是 0000 1100
(A | B) = 61, 也就是 0011 1101
(A ^ B) = 49, 也就是 0011 0001
A << 2 = 240 也就是 1111 0000
二进制向右移位运算符。左边的操作数A >> 2 = 15 也就的值由右操作数指定的位数向右移动。 是 0000 1111
5.5 三元运算符
运算符
:
描述
条件为真 ? X : 否则Y
示例
条件为真 ? X : 否则Y
6 流控制
Tcl提供两种流(条件判断)控制语句if、switch。判断条件可以是运算符操作结果、数字0或非0、true或false
6.1 if控制流
基本语法:
if { 表达式 } {
#运算;
} else {
#其他运算;
}
需要注意的是if…else、if…elseif…中的else、elseif必须要和if的后面一个{在同一行。
例如:
set a 3
if {$a > 4} {
puts "3>4";
} else {
puts "4>3";
}
6.2 switch控制流
基本语法:
switch $x {
数值1 { 操作1; }
数值2 { 操作2; }
}
例如:
set a 6
switch $a {
0 { puts "a is 0" }
1 { puts "a is 1" }
2 { puts "a is 2" }
3 { puts "a is 3" }
4 { puts "a is 4" }
default { puts "a is $a" }
}
7
循环
TCL语言提供循环以下类型来处理循环。
循环类型
while循环
for循环
描述
重复声明语句或一组,当给定的条件为真。它测试条件在执行循环体前
执行语句多次,序列和简写管理循环变量的代码
循环控制语句改变其正常的顺序执行。当执行离开范围,在该范围内创建的所有自动对象被销毁。TCL支持下面的控制语句。
控制语句 描述
continue语句
break语句
导致循环跳过它的主体的其余部分,并立即重新测试其条件声明之前
终止循环或switch语句并将执行立即循环或切换到下面的语句
7.1 while循环
while循环的语法是:
while {condition} {
statement(s)
}
在这里,声明(S)可以是单个语句或语句块。所述条件可以是任何表达,真是指任何非零值。循环迭代当条件为真。当条件为假,则程序控制进到紧接在循环之后的代码行。
流程图:
在这里,while循环的关键点是,当条件测试结果为假时,在循环可能不会永远运行。循环体将跳过while循环后的第一个语句将被执行。
例如:
set a 10
while { $a < 20 } {
puts "value of a: $a"
incr a
if { $a>15 } {
break; #判断提前结束循环
}
}
7.2 for循环
for循环的语法是:
for {initialization} {condition} {increment} {
statement(s);
}
流程图:
初始化步骤首先执行,并且只有一次。这一步可以声明和初始化任何循环控制变量。不需要把一个声明放在这里,只要给定一个分号。
接着,条件condition进行了计算。如果为真,则执行循环体。如果是假的,循环体不执行,for循环之后的流程控制跳转到下一条语句。
循环的执行主体之后,控制流跳转回到增量语句。此语句可以更新任何循环控制变量。这个语句可以留空,只需要一个分号。
条件现在重新计算评估。如果条件为真,循环执行的过程中重新执行(循环体,然后增加步,然后再次计算条件)。之后当条件为假时,for循环终止。
例如:
for { set a 1 } { $a<10 } { incr a } {
for { set b 1 } { $b<=$a } { incr b } {
}
set c [expr $a*$b]
puts -nonewline "$b*$a=$c "
if { ($c==6 || $c==8) && $b>1 } {
puts -nonewline " "
}
}
puts ""
8 TCL过程
Tcl过程是什么,只不过代码块的一系列命令,提供了一个可重复使用的特定功能。它被用于避免相同的代码被重复在多个位置。Tcl过程相当于许多编程语言中使用函数的功能。
Tcl proc命令用于定义一个Tcl过程。创建一个简单过程的语法如下所示:
proc procedureName {arguments} {
body
}
一个简单程序的例子如下:
proc helloWorld {} {
puts "Hello, World!"
}
helloWorld; #调用
8.1 过程的多个参数
对于程序带参数如下的例子所示:
proc add {a b} {
return [expr $a+$b]; #return返回值
}
puts [add 10 30]; #调用
8.2 过程的可变参数
对于程序带参数如下图的例子所示。
proc avg {numbers} {
set sum 0
foreach number $numbers {
set sum [expr $sum + $number]
}
set average [expr $sum/[llength $numbers]]
return $average; #return返回值
}
puts [avg {70 80 50 60}]; #调用
puts [avg {70 80 50 }]; #调用
8.3 过程使用默认参数
默认参数是用来提供一种可如果未提供任何参数值时,可以使用默认值。对于程序用其有时称为隐式参数默认参数,一个例子如下所示。
proc add {a {b 100} } {
return [expr $a+$b]
}
puts [add 10 30]; #将使用设定值
puts [add 10]; #将使用默认值
详细Tcl教程:/tcl/
版权声明:本文标题:TCL脚本基本语法 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/free/1704790779h462362.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论