问题是我在数组中的“插入”元素的顺序在脚本的执行过程中发生了变化。如何确保TCL不会混淆数组元素的顺序?
这是问题的快速再现:
#!/bin/bash
# : \
exec /home/binops/afse/eer/eer_SPI-7.3.1/tclsh "$0" "[email protected]"
proc myProc { theArray } {
upvar $theArray theArrayInside
parray theArrayInside
puts "------"
foreach { key value } [array get theArrayInside] {
puts "$key => $value"
}
}
# MAIN
set myArray(AQHI) AQHI
set myArray(O3) 1
set myArray(NO2) 2
set myArray(PM2.5) 3
parray myArray
puts "------"
myProc myArray
输出是:
myArray(AQHI) = AQHI
myArray(NO2) = 2
myArray(O3) = 1
myArray(PM2.5) = 3
------
theArrayInside(AQHI) = AQHI
theArrayInside(NO2) = 2
theArrayInside(O3) = 1
theArrayInside(PM2.5) = 3
------
PM2.5 => 3
O3 => 1
NO2 => 2
AQHI => AQHI
通知我没有使用通用的键,如A,B,C和通用值样1, 2,3,你可能已经预料到了。这是因为订单不会与这些通用键/值混淆。也许这可以帮助识别问题。
请注意,即使在第一次拨打parray
(订单现在是AQHI,NO2,O3,PM2.5;按字母顺序排列?),初始订单(AQHI,O3,NO2,PM2.5)也会丢失。然后再调用array get ...
(反向?)
再次更改因此,无论如何,问题是:我怎样才能确保最初的订单保存?
使用这种方法,你将如何去找到某个值的关键? – Shawn 2011-06-03 14:49:08
@Shawn,这里有一个方法:'foreach {key val} [array get ary] {if {$ val == $ search} {puts $ key; break}}' – 2011-06-03 14:54:05
明白了,我结束了使用'proc array_getKeyFromValue {array_name value} {upvar 1 $ array_name theArray;设置returnValue“”; array_foreach key theArray {if {$ theArray($ key)== $ value} {set returnValue $ key; }} return $ returnValue; }' – Shawn 2011-06-03 15:10:24