Tcl 中的数组
在 Tcl 编程教程的这一部分中,我们将介绍数组。 我们将初始化数组并从中读取数据。
Tcl 数组是变量的集合。 每个变量可以保存任何值,并且该数组由任意值索引。 键值对是无序的。 Tcl 数组是关联数组。
创建数组
可以使用set
或array set
命令创建 Tcl 数组。
#!/usr/bin/tclsh
set names(1) Jane
set names(2) Tom
set names(3) Elisabeth
set names(4) Robert
set names(5) Julia
set names(6) Victoria
puts [array exists names]
puts [array size names]
puts $names(1)
puts $names(2)
puts $names(6)
我们创建一个名为names
的数组。 数字是键,名称是数组的值。
set names(1) Jane
在这一行中,我们为数组键 1 设置了一个值Jane
。我们以后可以通过键引用该值。
puts [array exists names]
array exists
命令确定提供的参数是否为数组。
puts [array size names]
我们使用array size
命令获得数组的大小。
puts $names(1)
我们通过键访问数组中的一个值。
$ ./names.tcl
1
6
Jane
Tom
Victoria
示例的输出。
在第二个示例中,使用array set
命令创建一个数组。
#!/usr/bin/tclsh
array set days {
1 Monday
2 Tuesday
3 Wednesday
4 Thursday
5 Friday
6 Saturday
7 Sunday
}
set n [array size days]
puts $days(1)
puts "array has $n elements"
我们创建一个days
数组。 它具有 7 个键值对。
$ ./days.tcl
Monday
array has 7 elements
示例输出。
数组是变量的集合
与列表或字典不同,数组中的项目是变量。 这意味着我们可以引用它们。
#!/usr/bin/tclsh
array set days {
1 Monday
2 Tuesday
3 Wednesday
4 Thursday
5 Friday
6 Saturday
7 Sunday
}
upvar #0 days(1) mon
upvar #0 days(2) tue
upvar #0 days(3) wed
puts $mon
puts $tue
puts $wed
在脚本中,upvar
命令引用了days
数组的三个变量。
upvar #0 days(1) mon
mon
变量引用以 1 索引的变量。upvar
命令的第一个参数是上层,其中#0
表示顶层。 也就是说,days
数组和mon
变量都位于同一全局名称空间中。
puts $mon
在这里,我们通过mon
变量引用days
数组的项。
$ ./colvar.tcl
Monday
Tuesday
Wednesday
示例输出。
数组获取命令
array get
命令返回一个包含数组元素对的列表。
#!/usr/bin/tclsh
array set days {
Peter 34
Jane 17
Lucy 28
Mark 43
Anthony 36
}
puts [array get days]
该示例创建一个数组,并使用array get
命令打印其键值对。
$ ./arrayget.tcl
Peter 34 Anthony 36 Lucy 28 Jane 17 Mark 43
这是arrayget.tcl
脚本的输出。
遍历数组
在以下示例中,我们将展示如何遍历数组。
#!/usr/bin/tclsh
array set days {
1 Monday
2 Tuesday
3 Wednesday
4 Thursday
5 Friday
6 Saturday
7 Sunday
}
foreach {n day} [array get days] {
puts "$n -> $day"
}
该示例创建一个数组,并使用array get
命令打印其键值对。
foreach {n day} [array get days] {
array get
命令返回键,值元素的列表,可以使用foreach
命令对其进行迭代。
$ ./days2.tcl
4 -> Thursday
5 -> Friday
1 -> Monday
6 -> Saturday
2 -> Tuesday
7 -> Sunday
3 -> Wednesday
这是days2.tcl
脚本的输出。 请注意,成对的元素没有顺序。
以下脚本使用array names
命令遍历数组。
#!/usr/bin/tclsh
array set nums { a 1 b 2 c 3 d 4 e 5 }
puts [array names nums]
foreach n [array names nums] {
puts $nums($n)
}
我们创建一个简单的nums
数组并循环遍历。
array set nums { a 1 b 2 c 3 d 4 e 5 }
我们定义一个简单的数组。
puts [array names nums]
array names
返回一个列表,其中包含数组中所有元素的名称(键)。
foreach n [array names nums] {
puts $nums($n)
}
我们使用键来获取值。
$ ./getnames.tcl
d e a b c
4
5
1
2
3
getnames.tcl
脚本的输出。
前面的示例使用数组的副本,因此不太适合处理大型数组。 数组搜索工具效率更高。
#!/usr/bin/tclsh
array set days {
1 Monday
2 Tuesday
3 Wednesday
4 Thursday
5 Friday
6 Saturday
7 Sunday
}
set start [array startsearch days]
while {[array anymore days $start]} {
set key [array nextelement days $start]
puts $days($key)
}
array donesearch days $start
我们使用数组搜索命令来迭代一个简单的数组。
set start [array startsearch days]
array startsearch
命令引用数组的开头。
while {[array anymore days $start]} {
如果在数组搜索中还有剩余要处理的元素,则array anymore
命令返回 1。
set key [array nextelement days $start]
array nextelement
命令返回数组中下一个元素的名称。
array donesearch days $start
array donesearch
命令终止数组搜索并破坏与该搜索关联的所有状态。
移除元素
在本章的最后一个示例中,我们将展示如何从数组中删除元素。
#!/usr/bin/tclsh
set names(1) Jane
set names(2) Tom
set names(3) Elisabeth
set names(4) Robert
set names(5) Julia
set names(6) Victoria
puts [array size names]
unset names(1)
unset names(2)
puts [array size names]
我们创建一个names
数组。 我们使用unset
命令从数组中删除项目。 我们在删除两项之前和之后检查数组的大小。
set names(1) Jane
set
命令用于在数组中创建一个项目。
unset names(1)
我们使用unset
命令从数组中删除键为 1 的元素。
$ ./removing.tcl
6
4
一开始,数组中有 6 个元素。 删除两个元素后,剩下 4 个元素。
在 Tcl 教程的这一部分中,我们使用了 Tcl 数组。