跳转至

Tcl 中的数组

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

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

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

创建数组

可以使用setarray 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 数组。



回到顶部