(Glenn Jackman 在评论中提醒我array names
可以采用 glob 模式来选择名称。由于该功能在这种情况下显着简化了代码,因此我重写了我的答案以使用它。)
如果你有命令
set arr_set(variable.abc) {12,13}
set arr_set(variable.def) {15,16}
set arr_set(dont_care) {0,0}
在你的文件中source
,你可以使用它来获取标签值对的列表:
lmap name [array names arr_set variable.*] {
set tag [lindex [split $name .] 1]
list $tag $arr_set($name)
}
# => {abc 12,13} {def 15,16}
(如果您不想要该值,请使用set tag
代替list $tag $arr_set($name)
)
对于 Tcl 8.5 和更早版本,这也是一样的(将结果存储在 中res
):
set res {}
foreach name [array names arr_set variable.*] {
set tag [lindex [split $name .] 1]
lappend res [list $tag $arr_set($name)]
}
(如果您不想要该值,请使用lappend res $tag
代替lappend res [list $tag $arr_set($name)]
)
请注意,此解决方案仅在数组名称选择可以表示为 glob 模式时才有效。在不可能的情况下,仍然需要遵循这些思路的解决方案:
lmap name [array names arr_set] {
lassign [split $name .] prefix tag
if {$prefix in {foo bar baz}} {
list $tag $arr_set($name)
} else {
continue
}
}
文档:array,continue,foreach,if,lappend,lassign,lindex,list,lmap,lmap替换,set,source,split