問題是我在數組中的「插入」元素的順序在腳本的執行過程中發生了變化。如何確保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