Tcl字典命令之dict

dict

dict option arg1 ?arg2 ... argN?

操作字典,具体操作由option决定,option支持以下选项:

create

dict create ?key1 value1 key2 value2 ...keyN valueN?

 返回一个新字典,包含传入的key、value映射。

append

 dict append dictName key ?string ...? 

将给定的string追加到字典dictName中键key的值后面。如果key不存在,则相当于新增一个key的映射。如果未指定string,则视为空字符串。多个string会合并为一个字符串。此命令返回更新后的字典。

lapend

dict lappend dictName key ?value ...? 

将给定的value追加到dictName中指定key对应的列表中,可以同时追加多个value,如果key对应的值不是列表,会创建一个列表,并将原有值和追加的值放到列表中。如果key存在,但没有指定value,则不做任何操作。如果dictName中不存在key,则视为空列表,若此时value也未指定则会添加一个键为key值为空列表的元素,若指定了value则会将value作为列表的元素。如果key对应的值不能表示为列表则会报错。

exists

dict exists dictValue key ?key ...?

判断给定的键key是否存在于给定的字典dictValue中,如果存在返回true,否则返回false。exists只能判断一个键是否存在,当传入多个key时,会将多个key作为嵌套字典的键路径进行查找。

get

dict get dictValue ?key ...? 

获取dictValue中指定key的值,如果想获取嵌套字典中的值,则需要传入多个key作为键的路径。如果没有指定key则返回包含所有键值对的列表。如果字典中不存在指定的键则会报错。

incr

dict incr dictName key ?increment?

将字典dictName中指定key对应的值增加increment。如果未指定increment,则默认增加1。如果不存在指定的key,则视为0。如果key对应的值不是整数则会报错。

keys

 dict keys dictValue ?globPattern? 

返回包含dictValue所有键的列表。如果指定了globPattern,则只返回与之匹配的键的列表。列表中的键按其插入字典的顺序返回。

values

dict values dictValue ?globPattern?

返回包含字典dictValue的值的列表。如果指定了globPattern,则只返回根据string match规则与其匹配的值的列表。返回值按其插入字典dictValue的顺序排列。

set

dict set dictName key ?key ...? value

 使用value替换字典dictName中key对应的值。如果dictName中不存在key,则值会新增key到value的映射。当存在多个键时表示更新嵌套字典,此时如果第一个key不存在,则会新增一个嵌套字典。如果第一个key存在但是后面的key不存在则会报错missing value to go with key。

update

dict update dictName key varName ?key varName ...? body

使用映射dictName中key对应的值的变量varName执行body中的脚本。如果dictName没有指定的key,则其对应的变量varname为未设置。当body终止时,对varName所做的更改都会被会写到字典内即使body的结果是一个错误或其他异常,除非字典不可读所有的更新都被静默的丢弃。除非发成异常,否则dict update的结果是body的执行结果。建议只在本地作用域内使用此命令,因为dict update命令中的变量varName在命令完成后,除非显示的执行unset,否则仍然存在。此外,只有当body终止时,才会更改dictName中的内容。

replace

 dict replace dictValue ?key value ...?

返回一个新的字典,包括传入的dictValue以及一些额外的或不同的键值对。如果不传如键值对key、value,则返回的新字典与dictValue相同。键值对必须是成对出现,否则会报错。dictValue中存在的key会用心的value替换,不存在的key会新增到新的字典。

unset

dict unset dictName key ?key ...?

删除字典dictName中key对应的值。如果dictName中不存在key,则不进行任何操作。当存在多个键时表示删除嵌套字典中的元素,此时的键路径上除了最后一个key可以不存在外,前面的key必须存在,否则会报错key "xxx" not known in dictionary。

remove

dict remove dictValue ?key ...?

返回一个新的字典,字典包括键为key以外的所有dictValue中的键值对。如果不指定任何键则返回的字典与dictValue相同,如果key不在dictValue中,则不进行任何操作。

size

dict size dictValue

返回dictValue中键值对的数量,不包括值中嵌套的字典中的键值对。

merge

dict merge ?dictValue ...?

 返回一个新的字典,包含dictValue中的所有元素,多个dictValue具有相同的key的元素的时,最后一次出现的key对应的值会出现在新的字典中。

info

dict info dictValue

返回字典信息,信息的具体格式取决于字典的实现方式。由于字典是散列表实现的,所以放回结果类似于array statistics命令。

with

dict with dictName ?key ...? body

与update类似,使用dictName中key对应的值执行body中的脚本。如果key为多个表示嵌套字典的键路径,此时会使用键路径对应的字典执行body中的脚本。字典中key对应的值会映射到与key同名的变量中。与dict update一样,如果dictName不可读或者字典调整导致键路径没有对应的值,则会静默丢弃字典的更新。除非发成异常,否则dict with的结果是body的执行结果。建议只在本地作用域内使用此命令,因为dict with命令中的变量在命令完成后,除非显示的执行unset,否则仍然存在。此外,只有当body终止时,才会更改dictName中的内容。当body终止时如果dictName不是字典则会产生错误。因此当字典中的键与字典变量dictName有冲突时不建议使用此命令。

for

 dict for {keyName valueName} dictValue body

用于遍历字典dictValue,在执行body中脚本时,字典中每个键值对的键和值会分别分配给名为指定的keyName和valueName变量。dict for命令的结果为空字符串。当在body执行过程中遇到break时,会中止循环,结束dict for命令。当遇到continue命令时,会结束本轮循环。字典按键值对的插入顺序进行遍历。

filter

dict filter dictValue filterType arg ?arg ...?

返回一个新的与指定过滤类型匹配的键值对的字典。filterType支持三种类型:

key

 dict filter dictValue key ?globPattern ...?

 返回以stirng match的方式键与模式globPattern匹配的键值对。

value

dict filter dictValue value ?globPattern ...?

返回以stirng match的方式值与模式globPattern匹配的键值对。

script

 dict filter dictValue script {keyName valueName} script

通过将键赋值给变量keyName,值赋值给变量valueName,根据srcipt脚本的布尔值结果来确定键值对是否匹配。当脚本结果为true时,表示键值对匹配。字典按键值对的插入顺序进行遍历。当在srcipt执行过程中遇到break时,会中止循环,结束dict filter命令。当遇到continue命令时,会结束本轮循环。

map

dict map {keyName valueName} dictValue body

Tcl8.6新增的命令。此命令通过执行body中的命令,对字典dictValue中的键值进行转换,然后返回一个新的包含转换后的键值对的字典。名为keyName、valueName对应于dictValue中键值对的键与值。每次body执行完后,变量keyName、valueName的值即为新字典的键值。当在body执行过程中遇到break时,会中止循环,结束dict map命令。当遇到continue命令时,会结束本轮循环。另外要注意的是,如果不想对值做改变,需要对其进行显示的set操作,否则值会被设置为body中最后一个命令的返回值。

简单示例

set dic [dict create a 1 b 2 c 3]
dict append dic ab 4 5
dict append dic a 6
dict append dic ab
dict exists $dic a
dict get $dic b
dict incr dic a
dict incr dic a 2
dict lappend dic a
dict lappend dic a 1
dict lappend dic e
dict lappend dic e 1 2 3 4 5
dict keys $dic
dict keys $dic a*
dict set dic a 19 2
dict set dic f g h 8
dict unset dic i
dict unset dic f g h
dict unset dic f h
dict size $dic
dic update dic a varA b varB h varH { dict set varA 19 3;incr varB;set varH "H" }
puts $dic
puts $varA
set newDic [dict replace $dic a 1 b 2 d 4]
puts $newDic
puts $dic
set newDic [dict remove $dic a e g]
puts $newDic
puts $dic
dict values $dic
dict values $dic 3
dict values $dic 4*
dict remove $dic a e i
puts $newDic
puts $dic
set newDic [dict merge {a 1 b 2} {c 3 d 4 b 5}]
puts $newDic
dict info $dic
dict with dic a { incr 19;puts $19;}
puts $dic
dict for {k v} $dic {puts "$k--$v";}
dict filter $dic key a*
dict filter $dic value 4*
dict filter $dic script {k v} { expr { $k < "e"} }
dict map { k v } $dic { set k $k$k; set v $v;}
dict map { k v } $dic { set k $k$k;}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值