原文: https://zetcode.com/lang/tcl/arrays/

在 Tcl 编程教程的这一部分中,我们将介绍数组。 我们将初始化数组并从中读取数据。

Tcl 数组是变量的集合。 每个变量可以保存任何值,并且该数组由任意值索引。 键值对是无序的。 Tcl 数组是关联数组。

创建数组

可以使用setarray set命令创建 Tcl 数组。

  1. #!/usr/bin/tclsh
  2. set names(1) Jane
  3. set names(2) Tom
  4. set names(3) Elisabeth
  5. set names(4) Robert
  6. set names(5) Julia
  7. set names(6) Victoria
  8. puts [array exists names]
  9. puts [array size names]
  10. puts $names(1)
  11. puts $names(2)
  12. puts $names(6)

我们创建一个名为names的数组。 数字是键,名称是数组的值。

  1. set names(1) Jane

在这一行中,我们为数组键 1 设置了一个值Jane。我们以后可以通过键引用该值。

  1. puts [array exists names]

array exists命令确定提供的参数是否为数组。

  1. puts [array size names]

我们使用array size命令获得数组的大小。

  1. puts $names(1)

我们通过键访问数组中的一个值。

  1. $ ./names.tcl
  2. 1
  3. 6
  4. Jane
  5. Tom
  6. Victoria

示例的输出。

在第二个示例中,使用array set命令创建一个数组。

  1. #!/usr/bin/tclsh
  2. array set days {
  3. 1 Monday
  4. 2 Tuesday
  5. 3 Wednesday
  6. 4 Thursday
  7. 5 Friday
  8. 6 Saturday
  9. 7 Sunday
  10. }
  11. set n [array size days]
  12. puts $days(1)
  13. puts "array has $n elements"

我们创建一个days数组。 它具有 7 个键值对。

  1. $ ./days.tcl
  2. Monday
  3. array has 7 elements

示例输出。

数组是变量的集合

与列表或字典不同,数组中的项目是变量。 这意味着我们可以引用它们。

  1. #!/usr/bin/tclsh
  2. array set days {
  3. 1 Monday
  4. 2 Tuesday
  5. 3 Wednesday
  6. 4 Thursday
  7. 5 Friday
  8. 6 Saturday
  9. 7 Sunday
  10. }
  11. upvar #0 days(1) mon
  12. upvar #0 days(2) tue
  13. upvar #0 days(3) wed
  14. puts $mon
  15. puts $tue
  16. puts $wed

在脚本中,upvar命令引用了days数组的三个变量。

  1. upvar #0 days(1) mon

mon变量引用以 1 索引的变量。upvar命令的第一个参数是上层,其中#0表示顶层。 也就是说,days数组和mon变量都位于同一全局名称空间中。

  1. puts $mon

在这里,我们通过mon变量引用days数组的项。

  1. $ ./colvar.tcl
  2. Monday
  3. Tuesday
  4. Wednesday

示例输出。

数组获取命令

array get命令返回一个包含数组元素对的列表。

  1. #!/usr/bin/tclsh
  2. array set days {
  3. Peter 34
  4. Jane 17
  5. Lucy 28
  6. Mark 43
  7. Anthony 36
  8. }
  9. puts [array get days]

该示例创建一个数组,并使用array get命令打印其键值对。

  1. $ ./arrayget.tcl
  2. Peter 34 Anthony 36 Lucy 28 Jane 17 Mark 43

这是arrayget.tcl脚本的输出。

遍历数组

在以下示例中,我们将展示如何遍历数组。

  1. #!/usr/bin/tclsh
  2. array set days {
  3. 1 Monday
  4. 2 Tuesday
  5. 3 Wednesday
  6. 4 Thursday
  7. 5 Friday
  8. 6 Saturday
  9. 7 Sunday
  10. }
  11. foreach {n day} [array get days] {
  12. puts "$n -> $day"
  13. }

该示例创建一个数组,并使用array get命令打印其键值对。

  1. foreach {n day} [array get days] {

array get命令返回键,值元素的列表,可以使用foreach命令对其进行迭代。

  1. $ ./days2.tcl
  2. 4 -> Thursday
  3. 5 -> Friday
  4. 1 -> Monday
  5. 6 -> Saturday
  6. 2 -> Tuesday
  7. 7 -> Sunday
  8. 3 -> Wednesday

这是days2.tcl脚本的输出。 请注意,成对的元素没有顺序。

以下脚本使用array names命令遍历数组。

  1. #!/usr/bin/tclsh
  2. array set nums { a 1 b 2 c 3 d 4 e 5 }
  3. puts [array names nums]
  4. foreach n [array names nums] {
  5. puts $nums($n)
  6. }

我们创建一个简单的nums数组并循环遍历。

  1. array set nums { a 1 b 2 c 3 d 4 e 5 }

我们定义一个简单的数组。

  1. puts [array names nums]

array names返回一个列表,其中包含数组中所有元素的名称(键)。

  1. foreach n [array names nums] {
  2. puts $nums($n)
  3. }

我们使用键来获取值。

  1. $ ./getnames.tcl
  2. d e a b c
  3. 4
  4. 5
  5. 1
  6. 2
  7. 3

getnames.tcl脚本的输出。

前面的示例使用数组的副本,因此不太适合处理大型数组。 数组搜索工具效率更高。

  1. #!/usr/bin/tclsh
  2. array set days {
  3. 1 Monday
  4. 2 Tuesday
  5. 3 Wednesday
  6. 4 Thursday
  7. 5 Friday
  8. 6 Saturday
  9. 7 Sunday
  10. }
  11. set start [array startsearch days]
  12. while {[array anymore days $start]} {
  13. set key [array nextelement days $start]
  14. puts $days($key)
  15. }
  16. array donesearch days $start

我们使用数组搜索命令来迭代一个简单的数组。

  1. set start [array startsearch days]

array startsearch命令引用数组的开头。

  1. while {[array anymore days $start]} {

如果在数组搜索中还有剩余要处理的元素,则array anymore命令返回 1。

  1. set key [array nextelement days $start]

array nextelement命令返回数组中下一个元素的名称。

  1. array donesearch days $start

array donesearch命令终止数组搜索并破坏与该搜索关联的所有状态。

移除元素

在本章的最后一个示例中,我们将展示如何从数组中删除元素。

  1. #!/usr/bin/tclsh
  2. set names(1) Jane
  3. set names(2) Tom
  4. set names(3) Elisabeth
  5. set names(4) Robert
  6. set names(5) Julia
  7. set names(6) Victoria
  8. puts [array size names]
  9. unset names(1)
  10. unset names(2)
  11. puts [array size names]

我们创建一个names数组。 我们使用unset命令从数组中删除项目。 我们在删除两项之前和之后检查数组的大小。

  1. set names(1) Jane

set命令用于在数组中创建一个项目。

  1. unset names(1)

我们使用unset命令从数组中删除键为 1 的元素。

  1. $ ./removing.tcl
  2. 6
  3. 4

一开始,数组中有 6 个元素。 删除两个元素后,剩下 4 个元素。

在 Tcl 教程的这一部分中,我们使用了 Tcl 数组。