A-A+

TCL中的列表修改命令lrange、linsert、lreplace、lset和 lappend

2020年01月05日 脚本 阅读 2,679 views 次

TCL中用于修改列表的命令有五个:lrange、linsert、 lreplace、lset和 lappend。

lrange命令返回列表中某范围内的元素。它获取的参数包括一个列表和两个索引值,返回的是列表中这两个索引值相应的元素之间的所有元素组成的新列表(包括这两个索引值所对应的元素)。例如:

% lrange {a b c d e} 1 end-1

b c d

linsert命令把一个或多个元素插入已经存在的列表,从而形成新的列表,例如:

% set oldList {the fox jumps over the dog}
the fox jumps over the dog
% set midList [linsert $oldList 1 quick]
the quick fox jumps over the dog
% set newList [linsert $midList end-1 lazy]
the quick fox jumps over the lazy dog

linsert需要获取三个或更多个参数。第一个参数是一个列表,第二个参数是插入位置所对应的索引值,第三个以及其他参数是将要插入这个列表的新元素。 linsert的 返回值是一个列表。如果索引值大于或等于原列表的元素 个数,那么新元素会插入到列表的末尾。

lreplace命令从列表中删除元素,且可选地在它们的位置添加新的元素。它需要获取三个或更多个参数。第一个参数是一个列表,第二个和第三个参数给出了要删除的那部分元素的开头元素和结尾元素分别对应的索引值。如果只给定了三个参数,那么从原列表中删除指定部分元素,得到的新列表。如果 lreplace指定了更多的参数,这些参数会插入到被删除的元素的位置。例如:

% lreplace {a b c d e} 1 1 fooa foo c d e% lreplace {a b c d e} 1 2 three more elementsa three more elements d e% set var {a b c d e} a b c d e % set var [lreplace $var end end]a b c d 

TCL并没有单独的明确命令用于从列表中删除元素,如果 lreplace命令不指定用于替换的元素,就起到了删除列表中元素的功能。

有一个常见的操作是在列表的某个元素的值变化后更新存放在变量中的列表。过去 lreplace常用于这个目的,例如

set person {{Jane Doe} 30 female}
set person [lreplace $person 1 1 31]
{Jane Doe} 31 fema1e

lreplace并不是直接修改变量的值,需要进行一次命令替换来执行它,然后把返回的结果赋给存有列表的变量作为它的新值。这不仅写起来麻烦,而且缺乏效率,因为lreplace在创建新列表的时候必须复制原列表中的元素。如果经常需要更新一个大列表中的元素,效率会受明显影响。

当列表存放在一个变量中时,lset命令是一种快速简练地修改元素值的方法。它获取 变量名,列表中已经存在的一个元素对应的索引(或者一系列索引从而指向某个子列表 的元素)以及赋给这个元素的新值。lset返回变量的新值,例如:

% set person {{Jane Doe} 30 female}
{Jane Doe} 30 female
% lset person 1 32
{Jane Doe} 32 female
% lset person {0 1} Johson
{Jane Johson} 32 female
% lset person 0 0 Janice
{Janice Johson} 32 female

注意:不能用lset命今创建新的列表,它只能修改已经存在的列表.如果给定的索引指
向不存在的元素,lset会返回一个错误。

lappend命令提供了一种高效率的方法,把新的元素添加到存放在一个变量中的列表
里。它要获取一个存放列表的变量名作为参数,以及任意多个其他参数,这些参数作为元素添加到第一个参数指明的那个列表中,返回该列表变量的新值。例如:

% set var 11% lappend var 21 2% lappend var 3 4 51 2 3 4 5

lappend与append相似,只不过它会强制生成适当的列表结构。而append并不这样 做。例如,命令

lappend x $a $b $c

可以改写为

set x [concat $x [list $a $b $c]]

然而,与 append相比, lappend的运行效率更高。对于大的列表,可能会有显著的效率差异。

提示: lappend和lset与其他像lreplace这样的列表命令不同,它们所接受的是存放列表的变量,而不是直接接受列表,因此需要用存放列表的变量名为它们指明要处理的
列表。

个人公众号“数字化设计CAX联盟”,欢迎关注,共同交流
标签:
为您推荐:

给我留言

© 坐倚北风 版权所有 严禁镜像复制 苏ICP备15034888号. 基于 Ality 主题定制 AliCMS
联系邮箱:leanwind@163.con,微信公众号:数字化设计CAX联盟

用户登录

分享到: