# 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 数组。