#!/usr/bin/expect -f
set myarr1(chicken) animal
set myarr1(cows) animal
set myarr1(tiger) animal
set myarr1(horse) animal
set myarr2(carrot) vegetable
set myarr2(tomato) vegetable
set myarr2(potato) vegetable
set myarr2(pea) vegetable
set arr_list { myarr1 myarr2 }
foreach key [array names [lindex $arr_list 0]] {
puts "${key}=$[lindex $arr_list 0]($key)"
}
foreach key [array names [lindex $arr_list 1]] {
puts "${key}=$[lindex $arr_list 1]($key)"
}
获得的输出:
cows=$myarr1(cows)
horse=$myarr1(horse)
chicken=$myarr1(chicken)
tiger=$myarr1(tiger)
tomato=$myarr2(tomato)
pea=$myarr2(pea)
potato=$myarr2(potato)
carrot=$myarr2(carrot)
必需的输出:
cows=animal
horse=animal
chicken=animal
tiger=animal
tomato=vegetable
pea=vegetable
potato=vegetable
carrot=vegetable
如果我在foreach循环中使用以下内容,我可以获得所需的输出:
foreach key [array names myarr1] {
puts "${key}=$myarr1($key)"
}
foreach key [array names myarr2] {
puts "${key}=$myarr2($key)"
}
我正在尝试创建一个数组名称列表,然后循环遍历该数组名称列表并打印它。如果有更好的方法来解决这个问题,我很满意。谢谢你的帮助!
答案 0 :(得分:2)
你真的应该使用嵌套的foreach
。
foreach arr $arr_list {
foreach key [array names $arr] {
puts "${key}=$$arr($key)"
}
}
除非不起作用!为什么?在一个层面上很容易:$
的语法不支持这种复杂性;它实际上只支持合法变量名称的(非常有用的)子集,并且不能进行复杂的替换(array element 名称支持更多样化的选项)。我们需要重写以使用单参数set
形式作为第一步:
foreach arr $arr_list {
foreach key [array names $arr] {
puts "${key}=[set [set arr]($key)]"
}
}
有效,但不是很优雅(或者说很快)。 实际上更好地使用upvar 0
为您正在处理的数组创建本地别名;从a
到$arr
谈论的任何变量别名都会让我们缩短其他地方的内容,而且它在实践中非常优雅:
foreach arr $arr_list {
upvar 0 $arr a
foreach key [array names a] {
puts "$key=$a($key)"
}
}
你也可以做一些事情,比如排序元素名称列表(array names
不保证以任何特定的顺序返回内容),在每个数组之间放置间距打印出来等等。但这是如何改进事物的核心。您也可以使用array get
代替array names
和多变量foreach
,但是对键进行排序更加尴尬(好吧,在Tcl 8.6的lsort
之前获得了-stride
选项)。
答案 1 :(得分:1)
如果您只想打印它们,请使用捆绑的parray
proc:
foreach arr $arr_list {
parray $arr
}
输出
myarr1(chicken) = animal
myarr1(cows) = animal
myarr1(horse) = animal
myarr1(tiger) = animal
myarr2(carrot) = vegetable
myarr2(pea) = vegetable
myarr2(potato) = vegetable
myarr2(tomato) = vegetable
答案 2 :(得分:0)
您可以使用foreach
命令遍历数组中的键和值。
array set arr {a 1 b 2 c 3}
foreach {k v} [array get arr] {
puts $k=$v
}
参考文献:foreach
答案 3 :(得分:0)
您使用foreach
命令进入了正确的轨道,但要遍历您需要嵌套的数组列表:
foreach arr $arr_list {
foreach {key val} [array get arr] {
puts "$key = $val"
}
}
另外,查看parray命令,看看这种打印方式是否适合您的需要。 (我已将其关联,但该网站目前似乎已关闭。我会尝试记住以后再编辑。请查看http://www.tcl.tk/man/tcl8.6/上的命令详情
答案 4 :(得分:0)
你可能想要的是:
foreach arr $arr_list {
foreach key [array names $arr] {
puts "$key=[set ${arr}($key)]"
}
}
那就是说,你以非标准的方式使用数组,这可能不是最理想的。你看过字典了吗? (不幸的是,讨论如何构建数据不是Stackoverflow主题。)