如何在TCL中获取哈希名称和密钥?

时间:2013-08-10 23:35:29

标签: arrays hash tcl key-value

我正在尝试弄清楚如何在以下情况下获取哈希名称和密钥。假设我有以下哈希值:

set CLIENT(CAR) "Koenigsegg"

如果我将$CLIENT(CAR)传递给proc,则传递的值为“Koenigsegg”。有没有办法同时捕获存储该值分别为'CLIENT'和'CAR'的哈希和密钥这一事实?

例如:

proc foobar {item} {
  set the_item $item 
}

foobar $CLIENT(CAR)

在此示例中,proc仅接收$ CLIENT(CAR)的值,即“koenigsegg”。 $item是“koenigsegg”,但我不知道它是什么类型的项目。我想得到哈希名称“客户端”和密钥“CAR”,以便知道“koenigsegg”它是“客户端车”。

1 个答案:

答案 0 :(得分:4)

您可以将数组的名称传递给proc,然后使用upvar来访问它:

proc process_array {arrayName} {
    upvar 1 $arrayName myArray
    puts "Car is $myArray(CAR)"
}

set CLIENT(CAR) "Koenigsegg"
process_array CLIENT ;# Pass the name of the array, note: no dollar sign

输出:

Car is Koenigsegg

我希望这就是你要找的东西。

更新

因此,您希望将两个内容传递给proc:散列名称(Tcl将其称为“数组”)和索引名称(CAR):

proc process_array {arrayName index} {
    upvar 1 $arrayName myArray
    puts "My array is $arrayName"
    puts "List of indices: [array names myArray]"
    puts "Car is $myArray($index)"
}

set CLIENT(CAR) "Koenigsegg"
process_array CLIENT CAR;# Pass the name of the array, note: no dollar sign

输出:

My array is CLIENT
List of indices: CAR
Car is Koenigsegg

更新2

原来的海报(OP)似乎要求这样的东西:

process_array $CLIENT(CAR)

并期望proc process_array找出数组的名称(CLIENT)和索引(CAR)。据我所知,这是不可能的。当Tcl解释器遇到上面的行时,它会计算$CLIENT(CAR)表达式,并且该行变为:

process_array Koenigsegg

这意味着在process_array内,proc不知道任何数组。所有它知道是有人传给它一个字符串“Koenigsegg”

现在,如果你将proc的数组传递给proc,那么它可以找出数组的名称,数组中的任何索引。请参阅我之前的代码。