2017-08-10 112 views
0

可以說我有一個字典somedictkey1 value1Tcl的字典修改鍵值名

是否有修改key1,讓我們說,要somekey1而不刪除key1,使一個新的記錄somekey1的方法嗎?

+0

你要添加新的記錄到字典? –

+0

不,我只想重命名關鍵字 –

回答

1

你可以lappend字典中的新變量,並將舊變量的值設置爲新變量,然後unset舊密鑰。

set somedict [dict create key1 "black dict" key2 "white dict"] 

//dict update somedict key1 varKey1 { 
// dict lappend somedict someKey1 $varKey1 
// unset varKey1 
//} 
//or 
set rename key1 
set to someKey1 
set somedict [dict replace $somedict $to {[dict get $somedict $rename][dict unset $somedict $rename]}] 

set value [dict get $somedict someKey1] 
puts $value 

有關更多信息,請轉至TCL Dictionary

如果你正在尋找重命名變量命令,TCL中沒有這樣的事情。

+0

這也是我認爲要做的事,但認爲可能有更有效的方法。 –

+2

沒有更有效的方法;它必須在基礎表中創建一個新的哈希條目。然而,移動數據的價格很便宜;該條目的內容通過引用傳輸。 –

+0

請注意,目前所述的解決方案不起作用。 –

1

您可以利用字典也是一個列表,這也是一個字符串。

請注意,我通常會告訴你永遠不要混用操作和清單類型(即從不使用字符串上的列表操作)。但就像音樂一樣,在Tcl中,如果你只知道自己在做什麼,那麼每一條規則都會被打破。 (除十二語法規則,這些都是神聖不可侵犯的。)

鑑於本字典:

% set somedict [dict create key1 "black dict" key2 "white dict"] 
key1 {black dict} key2 {white dict} 

你可以做一個字符串變換:

% set somedict [string map {key1 somekey1} $somedict] 
somekey1 {black dict} key2 {white dict} 

,你會得到一個新的功能詞典:

% dict get $somedict somekey1 
black dict 

(該值將是一個字符串值,但它將恢復爲一個dictiona ry值)

這有點危險,但是:string map會對它找到的每個匹配項進行替換,包括更長的字符串內部。

如果你知道你想要以改變哪個鍵,你可以用一個簡單的列表轉換:

% lset somedict 0 somekey1 
somekey1 {black dict} key2 {white dict} 

如果你不知道它在哪裏,你可以搜索(它最好是雖然存在,否則lset試圖改變元素-1):

% lset somedict [lsearch $somedict key1] somekey1 
somekey1 {black dict} key2 {white dict} 

這是醜陋的,但它的簡單。

文檔: dictlsearchlsetstring