2017-08-10 34 views
0

は私がkey1 value1Tclはキー名

でdictのsomedictを考えてみましょう変更DICT key1を変更する方法はあります、somekey1key1を削除し、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ではあなたが何をやっているのか分かっていれば、すべてのルールが壊れる可能性があります。 (12の構文規則を除き、これらは神聖です。)

この辞書を考える:

% 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に戻ります)

これはちょっと危険ですが、string mapは長い文字列の中など、見つかったすべての文字に置換を行います。

あなたは順番に変更したいキーを知っているならば、あなたは単純なリスト変換を使用することができます。

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

それがどこにあるかわからない場合、あなたはそれを検索することができます(それが良いこと

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

それは醜いですが、それは簡単です:しかし、そうでない場合がありlsetは-1)の要素を変更しようとします。

ドキュメント: dictlsearchlsetstring

関連する問題