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