Tcl-Tk - 快速指南


Tcl - 概述

Tcl 是工具命令语言的缩写形式。加州大学伯克利分校的约翰·奥斯特豪特 (John Ousterhout) 设计了它。它是脚本语言及其自己的解释器的组合,嵌入到应用程序中,我们用它进行开发。

Tcl 最初是为 Unix 开发的。然后它被移植到 Windows、DOS、OS/2 和 Mac OSX。Tcl 与其他 UNIX shell 语言非常相似,例如 Bourne Shell (Sh)、C Shell (csh)、Korn Shell (sh) 和 Perl。

它旨在为程序提供与其他程序交互的能力,并充当嵌入式解释器。尽管最初的目标是使程序能够交互,但您可以找到用 Tcl/Tk 编写的成熟应用程序。

Tcl的特点

Tcl的特点如下:

  • 减少了开发时间。

  • 功能强大且简单的用户界面套件,集成了 TK。

  • 编写一次,随处运行。它可以在 Windows、Mac OS X 和几乎所有 Unix 平台上运行。

  • 对于有经验的程序员来说非常容易上手;因为该语言非常简单,他们可以在几个小时或几天内学会 Tcl。

  • 您可以使用 Tcl 轻松扩展现有应用程序。此外,还可以将 C、C++ 或 Java 中的 Tcl 包含到 Tcl 中,反之亦然。

  • 拥有一套强大的网络功能。

  • 最后,它是开源、免费的,可以无限制地用于商业应用。

应用领域

Tcl 是一种通用语言,您随处都可以找到 Tcl。这包括,

  • 通常由数据库支持的可扩展网站。
  • 使用 TclHttpd 构建高性能 Web 服务器。
  • Tcl 与基于 CGI 的网站。
  • 桌面 GUI 应用程序。
  • 嵌入式应用程序。

Tcl - 环境设置

本地环境设置

如果您愿意为 Tcl 设置环境,您的计算机上需要以下两个软件应用程序 -

  • 文本编辑器
  • Tcl 口译员。

文本编辑器

这将用于输入您的程序。一些文本编辑器的示例包括 Windows 记事本、操作系统编辑命令、Brief、Epsilon、EMACS 和 vim 或 vi。

文本编辑器的名称和版本可能因不同操作系统而异。例如,记事本将在 Windows 上使用,vim 或 vi 可以在 Windows 上使用,也可以在 Linux 或 UNIX 上使用。

您使用文本编辑器创建的文件称为源文件,包含程序源代码。Tcl 程序的源文件以扩展名“.tcl”命名。

在开始编程之前,请确保您有一个文本编辑器,并且您有足够的经验来编写计算机程序、将其保存在文件中、构建它并最终执行它。

Tcl 解释器

它只是一个小程序,使您能够键入 Tcl 命令并逐行执行它们。它会停止 tcl 文件的执行,以防遇到错误,这与完全执行的编译器不同。

让我们有一个 helloWorld.tcl 文件,如下所示。我们将使用它作为第一个程序,我们在您选择的平台上运行。

#!/usr/bin/tclsh

puts "Hello World!" 

在 Windows 上安装

从可用的 Active Tcl 二进制文件列表中下载最新版本的 Windows安装程序。活跃的 Tcl 社区版免费供个人使用。

运行下载的可执行文件来安装 Tcl,可以按照屏幕上的说明进行操作。

现在,我们可以通过使用“cd”命令切换到包含该文件的文件夹来构建并运行 Tcl 文件(例如 helloWorld.tcl),然后使用以下步骤执行程序

C:\Tcl> tclsh helloWorld.tcl

我们可以看到以下输出。

C:\Tcl> helloWorld

C:\Tcl 是我用来保存样本的文件夹。您可以将其更改为保存 Tcl 程序的文件夹。

在 Linux 上安装

大多数 Linux 操作系统都内置了 Tcl,您可以立即开始使用这些系统。如果它不可用,您可以使用以下命令下载并安装 Tcl-Tk。

$ yum install tcl tk

现在,我们可以通过使用“cd”命令切换到包含该文件的文件夹来构建并运行一个 Tcl 文件(例如 helloWorld.tcl),然后使用以下步骤执行该程序 -

$ tclsh helloWorld.tcl

我们可以看到以下输出 -

$ hello world

在基于 Debian 的系统上安装

如果您的操作系统中不可用,您可以使用以下命令下载并安装 Tcl-Tk -

$ sudo apt-get install tcl tk

现在,我们可以通过使用“cd”命令切换到包含该文件的文件夹来构建并运行一个 Tcl 文件(例如 helloWorld.tcl),然后使用以下步骤执行该程序 -

$ tclsh helloWorld.tcl

我们可以看到以下输出 -

$ hello world

在 Mac OS X 上安装

从可用的 Active Tcl 二进制文件列表中下载最新版本的 Mac OS X软件包。活跃的 Tcl 社区版免费供个人使用。

运行下载的可执行文件来安装 Active Tcl,这可以按照屏幕上的说明进行操作。

现在,我们可以通过使用“cd”切换到包含该文件的文件夹来构建并运行一个 Tcl 文件(例如 helloWorld.tcl),然后使用以下步骤执行该程序 -

$ tclsh helloWorld.tcl

我们可以看到以下输出 -

$ hello world

从源文件安装

当二进制包不可用时,您可以使用从源文件安装的选项。通常首选在 Windows 和 Mac OS X 上使用 Tcl 二进制文件,因此下面仅显示基于 UNIX 的系统上的源代码编译。

  • 下载源文件。

  • 现在,切换到下载的文件夹后,使用以下命令进行提取、编译和构建。

$ tar zxf tcl8.6.1-src.tar.gz
$ cd tcl8.6.1
$ cd unix
$ ./configure —prefix=/opt —enable-gcc
$ make
$ sudo make install

注意- 确保将文件名更改为在上面给出的命令 1 和 2 中下载的版本。

Tcl - 特殊变量

在 Tcl 中,我们将一些变量分类为特殊变量,它们具有预定义的用法/功能。下面列出了特殊变量的列表。

先生。 特殊变量和描述
1

精氨酸

指的是一些命令行参数。

2

精液

指包含命令行参数的列表。

3

精氨酸0

指正在解释的文件的文件名或我们调用脚本的名称。

4

环境

用于表示作为环境变量的元素数组。

5

错误代码

提供最后一个 Tcl 错误的错误代码。

6

错误信息

提供最后一个 Tcl 错误的堆栈跟踪。

7

tcl_interactive

用于通过分别将其设置为 1 和 0 在交互和非交互模式之间切换。

8

tcl_库

用于设置标准 Tcl 库的位置。

9

tcl_pkg路径

提供通常安装包的目录列表。

10

tcl_patchLevel

指Tcl解释器的当前补丁级别。

11

tcl_平台

用于表示包含 byteOrder、machine、osVersion、platform 和 os 等对象的元素数组。

12

tcl_精度

指的是精度,即在将浮点数转换为字符串时要保留的位数。默认值为 12。

13

tcl_提示符1

指主要提示。

14

tcl_提示2

指带有无效命令的辅助提示。

15

tcl_rc文件名

提供用户特定的启动文件。

16

tcl_traceCompile

用于控制字节码编译的跟踪。使用 0 表示无输出,1 表示摘要,2 表示详细。

17 号

tcl_traceExec

用于控制字节码执行的跟踪。使用 0 表示无输出,1 表示摘要,2 表示详细。

18

tcl_版本

返回 Tcl 解释器的当前版本。

上述特殊变量对于Tcl解释器有其特殊含义。

使用 Tcl 特殊变量的示例

让我们看一些特殊变量的示例。

Tcl版本

#!/usr/bin/tclsh

puts $tcl_version

当您运行该程序时,您将得到类似的输出,如下所示 -

8.6

Tcl环境路径

#!/usr/bin/tclsh

puts $env(PATH)

当您运行该程序时,您将得到类似的输出,如下所示 -

/home/cg/root/GNUstep/Tools:/usr/GNUstep/Local/Tools:/usr/GNUstep/
System/Tools:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/webmaster/.local/bin:/
home/webmaster/bin:/usr/local/scriba/bin:/usr/local/smlnj/
bin:/usr/local/bin/std:/usr/local/bin/extra:/usr/local/fantom/bin:/usr/
local/dart/bin:/usr/bin:/usr/local/bin:/usr/local/sbin:/usr/sbin:/opt/mono/
bin:/opt/mono/lib/mono/4.5:/usr/local/bin:.:/usr/libexec/sdcc:/usr/local/
icon-v950/bin:/usr/local/mozart/bin:/opt/Pawn/bin:/opt/jdk1.7.0_75/bin:/
opt/jdk1.7.0_75/jre/bin:/opt/pash/Source/PashConsole/bin/Debug/

Tcl 包路径

#!/usr/bin/tclsh

puts $tcl_pkgPath

当您运行该程序时,您将得到类似的输出,如下所示 -

/usr/lib64/tcl8.6 /usr/share/tcl8.6 /usr/lib64/tk8.6 /usr/share/tk8.6

Tcl库

#!/usr/bin/tclsh

puts $tcl_library

当您运行该程序时,您将得到类似的输出,如下所示 -

/usr/share/tcl8.6

Tcl 补丁级别

#!/usr/bin/tclsh

puts $tcl_patchLevel

当您运行该程序时,您将得到类似的输出,如下所示 -

8.6.6

TCL精密

#!/usr/bin/tclsh

puts $tcl_precision

当您运行该程序时,您将得到类似的输出,如下所示 -

0

Tcl启动文件

#!/usr/bin/tclsh

puts $tcl_rcFileName

当您运行该程序时,您将得到类似的输出,如下所示 -

~/.tclshrc

Tcl - 基本语法

Tcl 非常容易学习,让我们开始创建我们的第一个 Tcl 程序!

第一个 Tcl 程序

让我们编写一个简单的 Tcl 程序。所有 Tcl 文件都有一个扩展名,即 .tcl。因此,将以下源代码放入 test.tcl 文件中。

#!/usr/bin/tclsh

puts "Hello, World!" 

假设Tcl环境设置正确;让我们在切换到文件目录后运行程序,然后使用 -

$ tclsh test.tcl

我们将得到以下输出 -

Hello, World!

现在让我们看看Tcl程序的基本结构,以便您轻松理解Tcl语言的基本构建块。在 Tcl 中,我们使用换行符或分号来终止前一行代码。但如果您为每个命令使用换行符,则分号不是必需的。

评论

注释就像 Tcl 程序中的帮助文本一样,解释器会忽略它们。可以在开头使用 hash_(#) 符号编写注释。

#!/usr/bin/tclsh

# my first program in Tcl
puts "Hello World!" 

执行上述代码时,会产生以下结果 -

Hello World!

多行注释或块注释是使用“if”和条件“0”编写的。一个例子如下所示。

#!/usr/bin/tclsh

if 0 {
   my first program in Tcl program
   Its very simple
}
puts "Hello World!" 

执行上述代码时,会产生以下结果 -

Hello World!

内联注释使用;#。下面给出一个例子。

#!/usr/bin/tclsh

puts "Hello World!" ;# my first print in Tcl program

执行上述代码时,会产生以下结果 -

Hello World!

身份标识

Tcl 标识符是用于标识变量、函数或任何其他用户定义项的名称。标识符以字母 A 到 Z 或 a 到 z 或下划线 (_) 开头,后跟零个或多个字母、下划线、美元 ($) 和数字(0 到 9)。

Tcl 不允许在标识符中使用标点字符,例如 @ 和 %。Tcl 是区分大小写的_语言。因此Manpowermanpower在Tcl 中是两个不同的标识符。以下是一些可接受的标识符的示例 -

mohd       zara    abc   move_name  a_123
myname50   _temp   j     a23b9      retVal

Tcl 中的空白

仅包含空格(可能带有注释)的行称为空行,Tcl 解释器完全忽略它。

空白是 Tcl 中用来描述空白、制表符、换行符和注释的术语。空格将语句的一部分与另一部分分隔开,并使解释器能够识别语句中的一个元素(例如 put)的结束位置和下一个元素的开始位置。因此,在以下声明中 -

#!/usr/bin/tclsh

puts "Hello World!" 

“puts”和“Hello World!”之间必须至少有一个空白字符(通常是一个空格)以便口译员能够区分它们。另一方面,在以下声明中 -

#!/usr/bin/tclsh

puts [expr 3 + 2] ;# print sum of the 3 and 2

执行上述代码时,会产生以下结果 -

5

3 和 + 之间或 + 和 2 之间不需要空格字符;不过,如果您希望出于可读性的目的,您可以自由地添加一些内容。

Tcl - 命令

大家知道,Tcl是一种工具命令语言,命令是该语言最重要的部分。Tcl 命令内置于语言中,每个命令都有自己的预定义函数。这些命令构成该语言的保留字,不能用于其他变量命名。这些 Tcl 命令的优点是,您可以为这些命令中的任何一个定义自己的实现来替换原始的内置功能。

每个 Tcl 命令都会验证输入并减少解释器的工作。

Tcl命令实际上是一个单词列表,第一个单词代表要执行的命令。接下来的词代表论点。为了将单词分组为单个参数,我们用“”或 {} 将多个单词括起来。

Tcl 命令的语法如下 -

commandName argument1 argument2 ... argumentN

让我们看一个 Tcl 命令的简单示例 -

#!/usr/bin/tclsh

puts "Hello, world!"

执行上述代码时,会产生以下结果 -

Hello, world!

在上面的代码中,“puts”是 Tcl 命令,“Hello World”是 argument1。如前所述,我们使用“”对两个单词进行分组。

让我们看看带有两个参数的 Tcl 命令的另一个示例 -

#!/usr/bin/tclsh

puts stdout "Hello, world!"

执行上述代码时,会产生以下结果 -

Hello, world!

在上面的代码中,“puts”是 Tcl 命令,“stdout”是 argument1,“Hello World”是 argument2。在这里,stdout 使程序在标准输出设备中打印。

命令替换

在命令替换中,方括号用于评估方括号内的脚本。下面显示了添加两个数字的简单示例 -

#!/usr/bin/tclsh

puts [expr 1 + 6 + 9]

执行上述代码时,会产生以下结果 -

16

变量替换

在变量替换中,$ 用在变量名之前,这将返回变量的内容。下面显示了一个为变量设置值并打印它的简单示例。

#!/usr/bin/tclsh

set a 3
puts $a

执行上述代码时,会产生以下结果 -

3

反斜杠替换

这些通常称为转义序列;每个反斜杠后面跟着一个有其自己含义的字母。换行符替换的一个简单示例如下所示 -

#!/usr/bin/tclsh

puts "Hello\nWorld"

执行上述代码时,会产生以下结果 -

Hello
World

Tcl - 数据类型

Tcl 的原始数据类型是字符串,我们经常可以在 Tcl 上找到仅字符串语言的引号。这些原始数据类型依次为列表和关联数组创建复合数据类型。在Tcl中,数据类型不仅可以表示简单的Tcl对象,还可以表示复杂的对象,例如句柄、图形对象(主要是部件)和I/O通道。让我们研究一下上述各项的详细信息。

简单的 Tcl 对象

在Tcl中,无论是整数、布尔值、浮点数还是字符串。当你想使用一个变量时,可以直接给它赋值,没有Tcl中声明的步骤。这些不同类型的对象可以有内部表示。它可以在需要时将一种数据类型转换为另一种数据类型。为变量赋值的语法如下 -

#!/usr/bin/tclsh

set myVariable 18
puts $myVariable

执行上述代码时,会产生以下结果 -

18

上面的语句将创建一个变量名称 myVariable 并将其存储为字符串,尽管我们没有使用双引号。现在,如果我们尝试对变量进行算术运算,它会自动转换为整数。一个简单的例子如下所示 -

#!/usr/bin/tclsh

set myVariable 18
puts [expr $myVariable + 6 + 9]

执行上述代码时,会产生以下结果 -

33

需要注意的一件重要事情是,这些变量没有任何默认值,必须在使用之前为其赋值。

如果我们尝试使用 put 进行打印,该数字将转换为正确的字符串。与其他语言相比,Tcl 具有内部和外部两种表示形式,有助于轻松创建复杂的数据结构。此外,Tcl 由于其动态对象特性而更加高效。

字符串表示

与其他语言不同,在 Tcl 中,当它只是一个单词时,不需要包含双引号。一个例子可以是 -

#!/usr/bin/tclsh

set myVariable hello
puts $myVariable

执行上述代码时,会产生以下结果 -

hello

当我们想要表示多个字符串时,可以使用双引号或大括号。如下所示 -

#!/usr/bin/tclsh

set myVariable "hello world"
puts $myVariable
set myVariable {hello world}
puts $myVariable

执行上述代码时,会产生以下结果 -

hello world
hello world

列表

列表只不过是一组元素。使用双引号或大括号的一组单词可用于表示简单列表。一个简单的列表如下所示 -

#!/usr/bin/tclsh

set myVariable {red green blue}
puts [lindex $myVariable 2]
set myVariable "red green blue"
puts [lindex $myVariable 1]

执行上述代码时,会产生以下结果 -

blue
green

关联数组

关联数组的索引(键)不一定是整数。它通常是一个类似于键值对的字符串。一个简单的例子如下所示 -

#!/usr/bin/tclsh

set  marks(english) 80
puts $marks(english)
set  marks(mathematics) 90
puts $marks(mathematics)

执行上述代码时,会产生以下结果 -

80
90

手柄

Tcl 句柄通常用于表示文件和图形对象。这些可以包括网络请求的句柄以及其他通道,如串行端口通信、套接字或 I/O 设备。以下是创建文件句柄的示例。

set myfile [open "filename" r]

您将在Tcl 文件 I/O章节中看到有关文件的更多详细信息。

Tcl - 变量

在Tcl中,没有变量声明的概念。一旦遇到新的变量名,Tcl就会定义一个新的变量。

变量命名

变量的名称可以包含任意字符和长度。您甚至可以通过将变量括在花括号中来获得空格,但这不是首选方法。

set 命令用于给变量赋值。设置命令的语法是,

set variableName value

下面显示了一些变量的示例 -

#!/usr/bin/tclsh

set variableA 10
set {variable B} test
puts $variableA
puts ${variable B}

执行上述代码时,会产生以下结果 -

10
test

正如您在上面的程序中看到的,$variableName 用于获取变量的值。

动态打字

Tcl 是一种动态类型语言。需要时可以动态地将变量的值转换为所需的类型。例如,存储为字符串的数字 5 在进行算术运算时将转换为数字。如下所示 -

#!/usr/bin/tclsh

set variableA "10"
puts $variableA
set sum [expr $variableA +20];
puts $sum

执行上述代码时,会产生以下结果 -

10
30

数学表达式

正如您在上面的示例中看到的,expr 用于表示数学表达式。Tcl的默认精度是12位。为了获得浮点结果,我们应该至少添加一位小数。一个简单的例子解释了上面的内容。

#!/usr/bin/tclsh

set variableA "10"
set result [expr $variableA / 9];
puts $result
set result [expr $variableA / 9.0];
puts $result
set variableA "10.0"
set result [expr $variableA / 9];
puts $result

执行上述代码时,会产生以下结果 -

1
1.1111111111111112
1.1111111111111112

在上面的例子中,你可以看到三种情况。在第一种情况下,被除数和除数都是整数,我们得到一个整数作为结果。在第二种情况下,除数本身是一个十进制数,在第三种情况下,被除数是一个十进制数。在第二种和第三种情况下,我们都会得到一个十进制数作为结果。

在上面的代码中,您可以使用 tcl_ precision 特殊变量来更改精度。如下所示 -

#!/usr/bin/tclsh

set variableA "10"
set tcl_precision 5
set result [expr $variableA / 9.0];
puts $result

执行上述代码时,会产生以下结果 -

1.1111

Tcl - 运营商

运算符是告诉编译器执行特定数学或逻辑操作的符号。Tcl语言具有丰富的内置运算符,并提供以下类型的运算符 -

  • 算术运算符
  • 关系运算符
  • 逻辑运算符
  • 按位运算符
  • 三元运算符
运营商类型

本章将一一讲解算术运算符、关系运算符、逻辑运算符、位运算符和三元运算符。

算术运算符

下表列出了 Tcl 语言支持的所有算术运算符。假设变量“A”为 10,变量“B”为 20,则 -

显示示例

操作员 描述 例子
+ 添加两个操作数 A + B 将为 30
- 从第一个操作数中减去第二个操作数 A - B 将给出 -10
* 将两个操作数相乘 A * B 将给出 200
/ 分子除以分子 B/A 将给出 2
% 模数运算符和整数除法后的余数 B % A 将给出 0

关系运算符

下表列出了 Tcl 语言支持的所有关系运算符。假设变量A为 10,变量B为 20,则 -

显示示例

操作员 描述 例子
== 检查两个操作数的值是否相等,如果相等则条件为真。 (A == B) 不正确。
!= 检查两个操作数的值是否相等,如果值不相等则条件成立。 (A != B) 为真。
> 检查左操作数的值是否大于右操作数的值,如果是,则条件为真。 (A > B) 不正确。
< 检查左操作数的值是否小于右操作数的值,如果是,则条件为真。 (A < B) 为真。
>= 检查左操作数的值是否大于或等于右操作数的值,如果是,则条件为真。 (A >= B) 不正确。
<= 检查左操作数的值是否小于或等于右操作数的值,如果是,则条件为真。 (A <= B) 为真。

逻辑运算符

下表列出了Tcl语言支持的所有逻辑运算符。假设变量A为 1,变量B为 0,则 -

显示示例

操作员 描述 例子
&& 称为逻辑与运算符。如果两个操作数均非零,则条件为真。 (A && B) 是错误的。
|| 称为逻辑或运算符。如果两个操作数中的任何一个非零,则条件为真。 (A || B) 为真。
称为逻辑非运算符。用于反转其操作数的逻辑状态。如果条件为真,则逻辑 NOT 运算符将为假。 !(A && B) 为真。

按位运算符

位运算符作用于位并执行逐位运算。&、| 和 ^ 的真值表如下 -

p q 质与问 p| q p^q
0 0 0 0 0
0 1 0 1 1
1 1 1 1 0
1 0 0 1 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,则 -

显示示例

操作员 描述 例子
& 如果两个操作数中都存在,则二进制 AND 运算符会将一位复制到结果中。 (A & B) 将给出 12,即 0000 1100
| 如果任一操作数中存在该位,则二元或运算符会复制该位。 (A | B) 将给出 61,即 0011 1101
^ 如果在一个操作数中设置了该位,但不是在两个操作数中都设置了该位,则二进制 XOR 运算符会复制该位。 (A ^ B) 将给出 49,即 0011 0001
<< 二进制左移运算符。左操作数的值向左移动右操作数指定的位数。 A << 2 将给出 240,即 1111 0000
>> 二进制右移运算符。左操作数的值向右移动右操作数指定的位数。 A >> 2 将得到 15,即 0000 1111

三元运算符

显示示例

操作员 描述 例子
?: 三元 如果条件为真?然后值 X :否则值 Y

Tcl 中的运算符优先级

运算符优先级决定表达式中术语的分组。这会影响表达式的计算方式。某些运算符的优先级高于其他运算符;例如,乘法运算符的优先级高于加法运算符。

例如:x=7+3*2;此处,x 被分配为 13,而不是 20,因为运算符 * 的优先级高于 +,因此它首先乘以 3 * 2,然后添加到 7。

在这里,优先级最高的运算符出现在表的顶部,优先级最低的运算符出现在底部。在表达式中,将首先计算优先级较高的运算符。

显示示例

类别 操作员 关联性
一元 + - 右到左
乘法 * / % 左到右
添加剂 + - 左到右
转移 <<>> 左到右
关系型 <<=>>= 左到右
按位与 & 左到右
按位异或 ^ 左到右
按位或 | 左到右
逻辑与 && 左到右
逻辑或 || 左到右
三元 ?: 右到左

Tcl - 决策

决策结构要求程序员指定要由程序评估或测试的一个或多个条件,以及如果确定条件为真则要执行的一个或多个语句,以及可选地如果条件确定则要执行的其他语句确定为假。

以下是大多数编程语言中典型决策结构的一般形式 -

决策

Tcl语言内部使用expr命令,因此我们不需要显式地使用expr语句。

Tcl 语言提供以下类型的决策语句 -

先生。 声明及说明
1 if 语句

“if”语句由一个布尔表达式后跟一个或多个语句组成。

2 if...else 语句

“if”语句后面可以跟一个可选的“else”语句,该语句在布尔表达式为 false 时执行。

3 嵌套 if 语句

您可以在另一个“if”或“else if”语句内使用一个“if”或“else if”语句。

4 switch语句

switch语句允许测试变量是否与值列表相等

5 嵌套 switch 语句

您可以在另一个switch语句中使用一个switch语句。

这 ?: 操作员

我们已经介绍了条件运算符 ? :在上一章中,可以用来替换if...else语句。它具有以下一般形式 -

Exp1 ? Exp2 : Exp3;

其中 Exp1、Exp2 和 Exp3 是表达式。注意冒号的使用和位置。

'? 的值 expression' 的确定如下: Exp1 被计算。如果为真,则计算 Exp2 并成为整个 '? 的值。表达。' 如果 Exp1 为 false,则计算 Exp3 并且其值成为表达式的值。一个例子如下所示。

#!/usr/bin/tclsh

set a 10;
set b [expr $a == 1 ? 20: 30]
puts "Value of b is $b\n"
set b [expr $a == 10 ? 20: 30]
puts "Value of b is $b\n" 

当您编译并执行上述程序时,它会产生以下结果 -

Value of b is 30
Value of b is 20

Tcl - 循环

可能存在这样的情况,您需要多次执行一段代码。一般来说,语句是按顺序执行的:首先执行函数中的第一个语句,然后执行第二个语句,依此类推。

编程语言提供了各种控制结构,允许更复杂的执行路径。

循环语句允许我们多次执行一条语句或一组语句,以下是大多数编程语言中循环语句的一般形式 -

循环架构

Tcl 语言提供了以下类型的循环来处理循环需求。

先生。 循环类型和描述
1 while 循环

当给定条件为真时,重复一个语句或一组语句。它在执行循环体之前测试条件。

2 for循环

多次执行一系列语句并缩写管理循环变量的代码。

3 嵌套循环

您可以在任何另一个 while、for 或 do..while 循环中使用一个或多个循环。

循环控制语句

循环控制语句改变其正常顺序的执行。当执行离开作用域时,在该作用域中创建的所有自动对象都将被销毁。

Tcl 支持以下控制语句。

先生。 控制语句和描述
1 中断语句

终止循环或 switch 语句并将执行转移到紧随循环或 switch 之后的语句。

2 继续声明

导致循环跳过其主体的其余部分并在重复之前立即重新测试其条件。

无限循环

如果条件永远不会变为假,则循环将成为无限循环。while循环传统上用于此目的。您可以通过将条件表达式保留为 1 来创建无限循环。

while {1} {
   puts "This loop will run forever."
}

当条件表达式不存在时,假定为真。Tcl 程序员更常用 while {1} 结构来表示无限循环。

注意- 您可以通过按 Ctrl + C 键终止无限循环。

Tcl - 数组

数组是使用索引对一组元素进行系统排列。传统数组的语法如下所示。

set ArrayName(Index) value

下面显示了创建简单数组的示例。

#!/usr/bin/tclsh

set languages(0) Tcl
set languages(1) "C Language"
puts $languages(0)
puts $languages(1)

执行上述代码时,会产生以下结果 -

Tcl
C Language

数组大小

计算数组大小的语法如下所示。

[array size variablename]

打印尺寸的示例如下所示。

#!/usr/bin/tclsh

set languages(0) Tcl
set languages(1) "C Language"
puts  [array size languages]

执行上述代码时,会产生以下结果 -

2

数组迭代

不过,数组索引可以是不连续的,例如为索引 1 指定的值,然后为索引 10 指定的值,依此类推。但是,如果它们是连续的,我们可以使用数组迭代来访问数组的元素。用于打印数组元素的简单数组迭代如下所示。

#!/usr/bin/tclsh

set languages(0) Tcl
set languages(1) "C Language"
for { set index 0 }  { $index < [array size languages] }  { incr index } {
   puts "languages($index) : $languages($index)"
}

执行上述代码时,会产生以下结果 -

languages(0) : Tcl
languages(1) : C Language

关联数组

在 Tcl 中,所有数组本质上都是关联的。数组的存储和检索没有任何特定的顺序。关联数组的索引不一定是数字,并且可以稀疏填充。下面显示了具有非数字索引的关联数组的简单示例。

#!/usr/bin/tclsh

set personA(Name) "Dave"
set personA(Age) 14
puts  $personA(Name)
puts  $personA(Age)

执行上述代码时,会产生以下结果 -

Dave
14

数组索引

检索数组索引的语法如下所示。

[array names variablename]

打印尺寸的示例如下所示。

#!/usr/bin/tclsh

set personA(Name) "Dave"
set personA(Age) 14
puts [array names personA]

执行上述代码时,会产生以下结果 -

Age Name

关联数组的迭代

您可以使用数组的索引来迭代关联数组。一个例子如下所示。

#!/usr/bin/tclsh

set personA(Name) "Dave"
set personA(Age) 14
foreach index [array names personA] {
   puts "personA($index): $personA($index)"
}

执行上述代码时,会产生以下结果 -

personA(Age): 14
personA(Name): Dave

Tcl - 字符串

Tcl 的原始数据类型是字符串,我们经常可以在 Tcl 上找到仅字符串语言的引号。这些字符串可以包含字母数字字符、数字、布尔值,甚至二进制数据。Tcl 使用 16 位 unicode 字符,字母数字字符可以包含字母,包括非拉丁字符、数字或标点符号。

布尔值可以表示为 1、yes 或 true 表示 true,0、no 或 false 表示 false。

字符串表示

与其他语言不同,在 Tcl 中,当它只是一个单词时,不需要包含双引号。一个例子可以是 -

#!/usr/bin/tclsh

set myVariable hello
puts $myVariable

执行上述代码时,会产生以下结果 -

hello

当我们想要表示多个字符串时,可以使用双引号或大括号。如下所示 -

#!/usr/bin/tclsh

set myVariable "hello world"
puts $myVariable
set myVariable {hello world}
puts $myVariable

执行上述代码时,会产生以下结果 -

hello world
hello world

字符串转义序列

字符文字可以是普通字符(例如“x”)、转义序列(例如“\t”)或通用字符(例如“\u02C0”)。

Tcl 中有一些字符,当它们前面有反斜杠时,它们将具有特殊含义,它们用于表示换行符 (\n) 或制表符 (\t)。在这里,您有一些此类转义序列代码的列表 -

转义序列 意义
\\ \ 特点
\' ' 特点
\" “ 特点
\? ?特点
\A 警报或铃声
\b 退格键
\F 换页
\n 新队
\r 回车符
\t 水平制表符
\v 垂直标签

以下是显示一些转义序列字符的示例 -

#!/usr/bin/tclsh

puts "Hello\tWorld\n\nTutorialspoint";

当上面的代码被编译并执行时,它会产生以下结果 -

Hello   World

Tutorialspoint

字符串命令

下表列出了字符串命令的子命令列表 -

先生。 方法与说明
1

比较字符串1 字符串2

按字典顺序比较 string1 和 string2。如果相等则返回 0,如果 string1 在 string2 之前则返回 -1,否则返回 1。

2

第一个字符串1 字符串2

返回 string1 在 string2 中第一次出现的索引。如果没有找到,则返回-1。

3

索引字符串索引

返回索引处的字符。

4

最后一个字符串1 字符串2

返回 string1 在 string2 中最后一次出现的索引。如果没有找到,则返回-1。

5

长度字符串

返回字符串的长度。

6

匹配模式字符串

如果字符串与模式匹配,则返回 1。

7

范围字符串索引1索引2

返回字符串中从索引1到索引2的字符范围。

8

下弦_

返回小写字符串。

9

上弦_

返回大写字符串。

10

修剪字符串?修剪字符?

删除字符串两端的修剪字符。默认的修剪字符是空格。

11

修剪左字符串?修剪字符?

删除字符串左开头的修剪字符。默认的修剪字符是空格。

12

修剪右字符串?修剪字符?

删除字符串左端的修剪字符。默认的修剪字符是空格。

13

wordend查找字符串索引

返回包含索引处字符的单词之后的字符在 findstring 中的索引。

14

wordstart查找字符串索引

返回包含索引处字符的单词中第一个字符在 findstring 中的索引。

下面给出了一些常用的 Tcl 字符串子命令的示例。

字符串比较

#!/usr/bin/tclsh

set s1 "Hello"
set s2 "World"
set s3 "World"
puts [string compare $s1 $s2]
if {[string compare $s2 $s3] == 0} {
   puts "String \'s1\' and \'s2\' are same.";
}

if {[string compare $s1 $s2] == -1} {
   puts "String \'s1\' comes before \'s2\'.";
}

if {[string compare $s2 $s1] == 1} {
   puts "String \'s2\' comes after \'s1\'.";
}

当上面的代码被编译并执行时,它会产生以下结果 -

-1
String 's1' and 's2' are same.
String 's1' comes before 's2'.
String 's2' comes after 's1'.

字符串索引

#!/usr/bin/tclsh

set s1 "Hello World"
set s2 "o"
puts "First occurrence of $s2 in s1"
puts [string first $s2 $s1]
puts "Character at index 0 in s1"
puts [string index $s1 0]
puts "Last occurrence of $s2 in s1"
puts [string last $s2 $s1]
puts "Word end index in s1"
puts [string wordend $s1 20]
puts "Word start index in s1"
puts [string wordstart $s1 20]

当上面的代码被编译并执行时,它会产生以下结果 -

First occurrence of o in s1
4
Character at index 0 in s1
H
Last occurrence of o in s1
7
Word end index in s1
11
Word start index in s1
6

字符串长度

#!/usr/bin/tclsh

set s1 "Hello World"
puts "Length of string s1"
puts [string length $s1]

当上面的代码被编译并执行时,它会产生以下结果 -

Length of string s1
11

办理案件

#!/usr/bin/tclsh

set s1 "Hello World"
puts "Uppercase string of s1"
puts [string toupper $s1]
puts "Lowercase string of s1"
puts [string tolower $s1]

当上面的代码被编译并执行时,它会产生以下结果 -

Uppercase string of s1
HELLO WORLD
Lowercase string of s1
hello world

修剪字符

#!/usr/bin/tclsh

set s1 "Hello World"
set s2 "World"
puts "Trim right $s2 in $s1"
puts [string trimright $s1 $s2]

set s2 "Hello"
puts "Trim left $s2 in $s1"
puts [string trimleft $s1 $s2]

set s1 " Hello World "
set s2 " "
puts "Trim characters s1 on both sides of s2"
puts [string trim $s1 $s2]

当上面的代码被编译并执行时,它会产生以下结果 -

Trim right World in Hello World
Hello 
Trim left Hello in Hello World
 World
Trim characters s1 on both sides of s2
Hello World

匹配字符串

#!/usr/bin/tclsh

set s1 "test@test.com" 
set s2 "*@*.com"
puts "Matching pattern s2 in s1"
puts [string match "*@*.com" $s1 ]
puts "Matching pattern tcl in s1"
puts [string match {tcl} $s1]

当上面的代码被编译并执行时,它会产生以下结果 -

Matching pattern s2 in s1
1
Matching pattern tcl in s1
0

追加命令

#!/usr/bin/tclsh

set s1 "Hello" 
append s1 " World"
puts $s1

当上面的代码被编译并执行时,它会产生以下结果 -

Hello World

格式化命令

下表显示了 Tcl 中可用的格式说明符列表 -

说明符 使用
%s 字符串表示
%d 整数表示
%F 浮点表示
%e 尾数指数形式的浮点表示
%X 十六进制表示法

下面给出一些简单的例子 -

#!/usr/bin/tclsh

puts [format "%f" 43.5]
puts [format "%e" 43.5]
puts [format "%d %s" 4 tuts]
puts [format "%s" "Tcl Language"]
puts [format "%x" 40]

当上面的代码被编译并执行时,它会产生以下结果 -

43.500000
4.350000e+01
4 tuts
Tcl Language
28

扫描命令

Scan 命令用于根据格式说明符解析字符串。下面显示了一些示例。

#!/usr/bin/tclsh

puts [scan "90" {%[0-9]} m]
puts [scan "abc" {%[a-z]} m]
puts [scan "abc" {%[A-Z]} m]
puts [scan "ABC" {%[A-Z]} m]

当上面的代码被编译并执行时,它会产生以下结果 -

1
1
0
1

Tcl - 列表

列表是 Tcl 中可用的基本数据类型之一。它用于表示项目的有序集合。它可以在同一列表中包含不同类型的项目。此外,一个列表可以包含另一个列表。

需要注意的一件重要事情是,这些列表完全表示为字符串,并在需要时进行处理以形成单独的项目。因此,在这种情况下,请避免使用大型列表;使用数组。

创建列表

列表的一般语法如下 -

set listName { item1 item2 item3 .. itemn }
# or
set listName [list item1 item2 item3]
# or 
set listName [split "items separated by a character" split_character]

下面给出一些例子 -

#!/usr/bin/tclsh

set colorList1 {red green blue}
set colorList2 [list red green blue]
set colorList3 [split "red_green_blue" _]
puts $colorList1
puts $colorList2
puts $colorList3

执行上述代码时,会产生以下结果 -

red green blue
red green blue
red green blue

将项目附加到列表

将项目附加到列表的语法如下 -

append listName split_character value
# or
lappend listName value

下面给出一些例子 -

<