Tcl 如何在数组中使用名称的名称

Tcl 如何在数组中使用名称的名称,tcl,Tcl,我想在数组中使用名称的名称。我搜索了字典,但我的tcl版本旧了,所以我不能使用字典。我也无法升级tcl版本。那个么你们能告诉我如何使用下面这个脚本中的名字吗 set country korea set food kimchi set find($country)($food) spicy set country japan set food susi set find($country)($food) fresh set country international set food hamb

我想在数组中使用名称的名称。我搜索了字典,但我的tcl版本旧了,所以我不能使用字典。我也无法升级tcl版本。那个么你们能告诉我如何使用下面这个脚本中的名字吗

set country korea
set food kimchi
set find($country)($food) spicy

set country japan
set food susi
set find($country)($food) fresh

set country international
set food hamburger
set find($country)($food) standard

set country international
set food chicken
set find($country)($food) standard

foreach country [array names find] {
 puts $index
}
# I expect 'korea japan international'.. but It wasn't working

foreach country [array names find] {
foreach food [array names find($country)] {

 puts $country,$food,$food($country)($food)
}
}
# I expect
# korea,kimch,spicy
# japan,susi,fresh
# international,hamburger,standard
# international,chicken,standard
# but It was not working..


如果您不能使用字典,这意味着您使用的是Tcl 8.4或更早版本。这些都不受支持;Tcl的最低支持版本是8.5,目前只支持长期的关键bug修复级别,8.6是新工作的最低建议版本。正式的建议是升级,即使这对你来说是不可能的

那么,你被字典缠住了?你不能把它们嵌套在一些古老的版本中,因为它们可能是通过一个bug实现的,所以你需要找到一种不同的方法。最简单的方法可能是使用一个数组来保存另一个数组的名称。如果我们使用一些帮助程序,这可能是最简单的:

# Initialise the array ahead of time
array set find {}

proc setFoodInfo {country food info} {
    upvar 1 find find
    if {![info exists find($country)]} {
        # Generate a unique array name
        set find($country) find_[array size find]
    }
    upvar 1 $find($country) ary
    set ary($food) $info
    return
}

proc listFoods {country} {
    upvar 1 find find
    upvar 1 $find($country) ary
    return [array names ary]
}

proc getFoodInfo {country food} {
    upvar 1 find find
    upvar 1 $find($country) ary
    return $ary($food)
}

setFoodInfo korea kimchi spicy
setFoodInfo japan sushi fresh
setFoodInfo international hamburger standard
setFoodInfo international chicken standard

foreach country [array names find] {
    foreach food [listFoods $country] {
        puts $country,$food,[getFoodInfo $country $food]
    }
}
当我在Tcl 8.4中测试它时-幸运的是,我仍然有一个副本-我得到以下输出:

international,chicken,standard international,hamburger,standard japan,sushi,fresh korea,kimchi,spicy 但当你想问“我有哪些国家的食品信息?”这样的问题时,这就变得相当混乱了。对于合理的键来说,这并不是不可克服的,因为您可以使用带有数组名的glob模式并解析结果,例如使用split或regexp,但这相当混乱。对于这个特定的示例,最好的答案是使用SQL数据库,但这涉及到一个额外的包和可能更多的外部设置

set find(korea,kimchi) spicy
...


foreach name [array names find] {
    puts $name,$find($name)
}