~/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 命令是一种多用途工具,很象 string。array exists 命令用于测试变量是否作为数组存在,array get 用于将数组转换成列表格式,array set 用于将列表转换为数组,array names 用于返回下标列表,array size 用于返回对下标进行计数的结果。搜索整个数组有它自己的一组四个命令:array startseach、array anymore、array nextelement 和 array donesearch。
虽然设计之初 Tcl 数组是一维的,但有一个模拟多维结构的好方法。因为下标是任意字符串,所以二维数组可以声明如下:
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语言(七)
Tcl 过程
#!/usr/bin/tclsh
#
# Demonstrate procedures and
# global scoping briefly
set PI [expr 2 * asin(1.0)]
proc circum {
global PI
return [expr 2.0 * $rad * $PI]
}
proc c_area {
global PI
return [expr $rad * $rad * $PI]
}
set rad 3
puts stdout "Area of circle ofradius $rad is [c_area $rad],\nthe circumference is[circum $rad].\n"
*********
~/tcltk$ ./protest.tcl
Area of circle of radius 3 is 28.2743338823,
the circumference is 18.8495559215.
变量作用域规则
作用域规则描述了过程和变量名以及值在程序的不同层次上的可见性。例如,在脚本的最外层定义的变量是全局变量。缺省情况下,全局变量是不可见的,在过程内部也不可用它们的值。这允许过程的编写者自由地定义变量名并赋值,而不必担心覆盖对于局部作用域上未知的重要变量。要使全局变量在过程内部变得可见,必须将它声明为在过程内,就象在上一屏的示例中,对 PI 使用 global 命令那样。
if {[info exists uData($Acct,rname)]} {
return 1
}
set uData($Acct,rname) $rName
set uData($Acct,email) $eMail
set uData($Acct,phone) $phone
return 0
}
文件信息和操作(再提醒您一次,所有都是以 file 开始)是通过 atime、attributes、copy、delete、lstat、mkdir、mtime、readlink、rename、rootname、size、stat 和 type 来完成。请注意,在 Windows 或 Mac 环境中运行一些文件信息命令时,可能会返回未定义的数据,因为例如在那些文件系统中没有表示索引节点和符号(和硬)链接数据。