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/


本文标签: 运算符 循环 变量 条件 语句