首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Tcl/Tk 快速入门 Tcl 语言-2

Tcl/Tk 快速入门 Tcl 语言-2

Tcl 列表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
~/tcltk$ tclsh
% set c1 {Bob Carol}
Bob Carol

% set c2 [list Ted Alice]
Ted Alice

% set Party1 [list $c1 $c2]
{Bob Carol} {Ted Alice}

% set Party2 [concat $c1 $c2]
Bob Carol Ted Alice

% linsert $Party1 1 Richard
{Bob Carol} Richard {Ted Alice}

%




列表在 Tcl 中有两个主要用途。我们已经在通过 foreach                     命令(在 中找到)处理命令行自变量的环境中看到第一个用途。第二个用途是动态地构建 Tcl 命令的元素,可以在本教程后面看到使用 eval 命令来执行这种用途。
list 命令接受它的所有自变量并将它们返回在一个列表环境中。自变量可以是值或变量。在左边这个示例中,可以手工创建列表,或可将其它列表视作自变量来使用列表(从而保存第一个“Party”的两对方向)。或者,concat 命令用于将两个或多个列表合并到顶级项的单个实体,返回第二个更有趣的“Party”。
其它一些有用的列表命令及其语法是:                       
  • llength $List                                        ― 返回顶级项的计数结果。
  • lindex $List n ― 返回已建立下标的项,从 0 开始计数。
  • lrange $List i j ― 返回列表元素的范围。
  • lappend $List item... ― 将项附加到列表。
  • linsert $List n item... ― 在列表中的指定位置上插入一项或多项,向下移列表中的其它项。
其余列表命令还包括 lreplacelsearchlsortsplit 命令将字符串作为输入并生成经过正确解析的列表,并且在指定的字符处断开字符串。join 执行相反操作,接受列表元素并将它们串在一起,用 joinstring 分隔它们。
Tcl 数组
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
~/tcltk$ tclsh
%  set People(friend) Tom
Tom
%  set People(spouse) Marcia
Marcia
% set People(boss) Jack
Jack
% array names People
friend boss spouse
% set Person $People(friend)
Tom
% array get People
friend Tom boss Jack spouse Marcia
% set People(friend) \
    [concat $People(friend) Bob]
Tom Bob
% set Person $People(friend)
Tom Bob
%




理解 Tcl 数组的捷径是,将它们视作与 Perl 散列相同的东西。Tcl 数组不是用数字建立下标的线性数据结构,除非选择对数据强加那种解释。尽管带空格的字符串需要用引号括起或需要一个变量引用,但下标(或键)可以是任何字符串。
正如一般的变量一样,使用 set 命令初始化数组,如左边所示。圆括号内是给出的下标部分。请注意,圆括号不象花括号或双引号那样提供分组。一旦初始化为数组,就不能将变量作为单一变量来访问。如左边列表底部所示,数组元素也可以是列表。
更多 Tcl 数组array 命令是一种多用途工具,很象 stringarray exists 命令用于测试变量是否作为数组存在,array get 用于将数组转换成列表格式,array set 用于将列表转换为数组,array names 用于返回下标列表,array        size 用于返回对下标进行计数的结果。搜索整个数组有它自己的一组四个命令:array startseacharray anymorearray nextelementarray donesearch
虽然设计之初 Tcl 数组是一维的,但有一个模拟多维结构的好方法。因为下标是任意字符串,所以二维数组可以声明如下:
1
2
3
4
5
set i 1 ; set j 10

set array($i,$j) 3.14159
incr $j
set array($i,$j) 2.71828




这些数组键实际上分别只是字符串“1,10”和“1,11”,但对访问数据来说,谁知道这之间的差异?
Tcl 过程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/usr/bin/tclsh
#
# Demonstrate procedures and
# global scoping briefly

set PI [expr 2 * asin(1.0)]
  
proc circum {rad} {
    global PI
    return [expr 2.0 * $rad * $PI]
}
  
proc c_area {rad} {
    global PI
    return [expr $rad * $rad * $PI]
}
  
set rad 3
  
puts stdout "Area of circle of\
radius $rad is [c_area $rad],\n\
the circumference is\
[circum $rad].\n"

*********
~/tcltk$ ./protest.tcl
Area of circle of radius 3 is 28.2743338823,
the circumference is 18.8495559215.




proc 命令定义 Tcl 过程。一旦定义后,就可以象内置的 Tcl 命令那样调用或使用它。另外,可以用缺省值定义这些参数;例如,将左边的定义更改为读取        proc c_area { {rad 1} } 。这将调用没有参数的 c_area 过程,并返回单位圆的面积。
所使用的 rename 命令正如它的字面含意一样,为现有命令或过程提供新名称。使用 rename 有两个明显的原因。第一个原因是,通过重命名原有过程,然后用相同名称的过程替换它,来给现有命令添加功能。过程可以调用原过程,必要时可以添加一些需要的功能。使用 rename 的第二个原因是,映射一个不存在的命令,例如,象 rename exec {}; 一样,可以防止用户执行外部命令。
返回列表