我正在尝试弄清楚如何在以下情况下获取哈希名称和密钥。假设我有以下哈希值:
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”它是“客户端车”。
答案 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
原来的海报(OP)似乎要求这样的东西:
process_array $CLIENT(CAR)
并期望proc process_array
找出数组的名称(CLIENT
)和索引(CAR
)。据我所知,这是不可能的。当Tcl解释器遇到上面的行时,它会计算$CLIENT(CAR)
表达式,并且该行变为:
process_array Koenigsegg
这意味着在process_array
内,proc不知道任何数组。所有它知道是有人传给它一个字符串“Koenigsegg”。
现在,如果你将proc的数组传递给proc,那么它可以找出数组的名称,数组中的任何索引。请参阅我之前的代码。