在 Tcl 编程教程的这一部分中,我们将介绍数组。 我们将初始化数组并从中读取数据。
Tcl 数组是变量的集合。 每个变量可以保存任何值,并且该数组由任意值索引。 键值对是无序的。 Tcl 数组是关联数组。
创建数组
可以使用set或array set命令创建 Tcl 数组。
#!/usr/bin/tclshset names(1) Janeset names(2) Tomset names(3) Elisabethset names(4) Robertset names(5) Juliaset names(6) Victoriaputs [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.tcl16JaneTomVictoria
示例的输出。
在第二个示例中,使用array set命令创建一个数组。
#!/usr/bin/tclsharray set days {1 Monday2 Tuesday3 Wednesday4 Thursday5 Friday6 Saturday7 Sunday}set n [array size days]puts $days(1)puts "array has $n elements"
我们创建一个days数组。 它具有 7 个键值对。
$ ./days.tclMondayarray has 7 elements
示例输出。
数组是变量的集合
与列表或字典不同,数组中的项目是变量。 这意味着我们可以引用它们。
#!/usr/bin/tclsharray set days {1 Monday2 Tuesday3 Wednesday4 Thursday5 Friday6 Saturday7 Sunday}upvar #0 days(1) monupvar #0 days(2) tueupvar #0 days(3) wedputs $monputs $tueputs $wed
在脚本中,upvar命令引用了days数组的三个变量。
upvar #0 days(1) mon
mon变量引用以 1 索引的变量。upvar命令的第一个参数是上层,其中#0表示顶层。 也就是说,days数组和mon变量都位于同一全局名称空间中。
puts $mon
在这里,我们通过mon变量引用days数组的项。
$ ./colvar.tclMondayTuesdayWednesday
示例输出。
数组获取命令
array get命令返回一个包含数组元素对的列表。
#!/usr/bin/tclsharray set days {Peter 34Jane 17Lucy 28Mark 43Anthony 36}puts [array get days]
该示例创建一个数组,并使用array get命令打印其键值对。
$ ./arrayget.tclPeter 34 Anthony 36 Lucy 28 Jane 17 Mark 43
这是arrayget.tcl脚本的输出。
遍历数组
在以下示例中,我们将展示如何遍历数组。
#!/usr/bin/tclsharray set days {1 Monday2 Tuesday3 Wednesday4 Thursday5 Friday6 Saturday7 Sunday}foreach {n day} [array get days] {puts "$n -> $day"}
该示例创建一个数组,并使用array get命令打印其键值对。
foreach {n day} [array get days] {
array get命令返回键,值元素的列表,可以使用foreach命令对其进行迭代。
$ ./days2.tcl4 -> Thursday5 -> Friday1 -> Monday6 -> Saturday2 -> Tuesday7 -> Sunday3 -> Wednesday
这是days2.tcl脚本的输出。 请注意,成对的元素没有顺序。
以下脚本使用array names命令遍历数组。
#!/usr/bin/tclsharray 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.tcld e a b c45123
getnames.tcl脚本的输出。
前面的示例使用数组的副本,因此不太适合处理大型数组。 数组搜索工具效率更高。
#!/usr/bin/tclsharray set days {1 Monday2 Tuesday3 Wednesday4 Thursday5 Friday6 Saturday7 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/tclshset names(1) Janeset names(2) Tomset names(3) Elisabethset names(4) Robertset names(5) Juliaset names(6) Victoriaputs [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.tcl64
一开始,数组中有 6 个元素。 删除两个元素后,剩下 4 个元素。
在 Tcl 教程的这一部分中,我们使用了 Tcl 数组。
