|
|
Tcl8.5からの新しいデータ型のdictについて。 コマンド早引き †
基本的な使い方 †set d [dict create name toyota] で作成。必要に応じてlist型と相互変換してるので、[list name toyota]でリストを作って入れても、dictコマンドでdict型に変換するので、使う分にはキーと値のペアのlist型とdict型はあまり気にしないでよいみたいだ。 set d [dict create] dict set d name toyota dict set d code 7203 みたいな。 ネスト †dictは入れ子にできる。これはdictがarrayと違う大きな要因の一つだと思う。 % set d [dict create a [dict create aa 0] b 1]
a {aa 0} b 1
%
% dict get $d a
aa 0
%
% dict get $d a aa
0
これはaの子のdictのaaにアクセスしてみた感じ。 set d [dict create a 0 b 1] dict set d c cc 2
set d [dict create a 0 b 1]
dict set d c {}
dict set d c cc 2
便利な使いどころ †arrayの代用。arrayはprocの中からそのまま返せなかったりするので、[array get a]と[array set a]などを入出力に使ったり、upvarを使ったり、グローバル変数としてアクセスするなどしていた。 # 例1 : array get/array setで入出力
proc test {alist} {
array set arr $alist
....
return [array get arr]
}
array set ga {hoge 0 fuga 1}
test [array get ga]
# 例2 : upvarで参照渡しみたいな。
proc test {alist} {
upvar $alist arr
....
}
array set ga {hoge 0 fuga 1}
test ga
proc test {} {
return [dict create hoge 0 fuga 1]
}
puts [test]
やっと人並みになった感じが・・・。つうか今のarrayを廃止して、dictで全部実装しなおした方がよいような・・・。 dict filterの練習 †フィルターはkey, value, scriptの三つの種類がある。 dict filter dict key pattern
dict filter dict value pattern
dict filter dict script {keyName valueName} body
% dict filter {aa 0 ab 1 ac 2 ba 3 bb 4 bc 5} key a*
ac 2 aa 0 ab 1
% dict filter {n1 akane n2 aiko n3 ayumi n4 ai} value ai*
n2 aiko n4 ai
% dict filter {toyota 1.15 honda 3.05 nissan -0.71} script {k v} {expr $v>0}
toyota 1.15 honda 3.05
dict updateの練習 †set info {name toyota code 7203}
dict update info name nameVar code codeVar {
set nameVar [string toupper $nameVar]
set codeVar ($codeVar)
}
puts $info
name TOYOTA code (7203) と、まあこの場合、infoのnameがnameVarに、codeがcodeVarにアサインされて、ボディ中で色々いじって、最後にinfoに値が書き戻されるという。dict withも似たようなもんだが、dict updateは要素の中身を追加できるとこがdict withと違うようだ。 set info {name toyota code 7203 price 5280}
dict update info per perVar {
set perVar 15
}
puts $info
name toyota per 15 price 5280 code 7203 あまり良い例じゃないような・・・。まあいいか。 set info {name toyota code 7203 price 5280}
dict update info price priceVar {
unset priceVar
}
puts $info
name toyota code 7203 最後の書き戻しの時に、マップされた値(この場合priceVar)が無いとdictからその対応したキーが削除される。 set info {name toyota code 7203 price 5280}
dict update info price2 price2Var {
set price2Var [expr 2 * [dict get $info price]]
}
puts $info
price2 10560 name toyota price 5280 code 7203 dict withの練習 †BASICのwithみたいなイメージ? set info {name toyota code 7203 price 5280}
dict with info {
puts name=$name
puts code=$code
puts price=$price
}
みたいな。書き換えても反映される。 set info {name toyota code 7203 price 5280}
dict with info {
unset name
}
puts $info
price 5280 code 7203 速度比較 †コメントをどーぞ †
リンク †
|