Arrays 在TCL中按索引更改列表中的项
我正在尝试使用这种糟糕的语言,我必须通过使用索引访问列表项来更改列表项Arrays 在TCL中按索引更改列表中的项,arrays,list,file,tcl,Arrays,List,File,Tcl,我正在尝试使用这种糟糕的语言,我必须通过使用索引访问列表项来更改列表项 set FileRead [open "$flPath" r] set Data [read $FileRead] set DataList [split $Data "\n"] #Guess that it creates a list, not an array right? for {set i 1} { $i < [llength $DataList]} {incr i} { set line [l
set FileRead [open "$flPath" r]
set Data [read $FileRead]
set DataList [split $Data "\n"] #Guess that it creates a list, not an array right?
for {set i 1} { $i < [llength $DataList]} {incr i} {
set line [lindex $DataList $i]
#Some changes on $line
lreplace $DataList $i $line # Thought this should replace the DataList[$i] with my $line
}
set FileRead[打开“$flPath”r]
设置数据[读取$FileRead]
set DataList[split$Data“\n”]#猜测它创建的是列表,而不是数组,对吗?
对于{set i 1}{$i<[llength$DataList]}{incr i}{
设置行[lindex$DataList$i]
#$line上的一些更改
lreplace$DataList$i$line#认为这应该用我的$line替换DataList[$i]
}
我不明白TCL糟糕的语法!我怎样才能意识到这一点呢?你不应该因为不知道如何使用一种语言就把它称为糟糕的语言,否则,就干脆不要使用它 在任何情况下,您都应该阅读
lreplace
。您提供:
lreplace list first last ?element element ...?
要替换数据列表
列表中的行,应将行更改为:
lreplace $DataList $i $i $line
这将用行中的字符串替换DataList
中的i
th项
但是,这不会改变列表DataList
,您需要将lreplace
的结果设置为变量(lreplace
不会直接改变列表DataList
)
但是,如果一次只更改列表中的一项,则最好使用:
set FileRead[打开“$flPath”r]
设置数据[读取$FileRead]
set DataList[split$Data“\n”]#猜测它创建的是列表,而不是数组,对吗?
对于{set i 1}{$i<[llength$DataList]}{incr i}{
设置行[lindex$DataList$i]
#$line上的一些更改
lset数据列表$i$行
}
lset
与lreplace
不同,它不需要设置,因为它除了返回替换的列表外,还更改了列表。你不应该因为不知道如何使用一种语言而将其称为糟糕的语言,否则,根本就不要使用它
在任何情况下,您都应该阅读lreplace
。您提供:
lreplace list first last ?element element ...?
要替换数据列表
列表中的行,应将行更改为:
lreplace $DataList $i $i $line
这将用行中的字符串替换DataList
中的i
th项
但是,这不会改变列表DataList
,您需要将lreplace
的结果设置为变量(lreplace
不会直接改变列表DataList
)
但是,如果一次只更改列表中的一项,则最好使用:
set FileRead[打开“$flPath”r]
设置数据[读取$FileRead]
set DataList[split$Data“\n”]#猜测它创建的是列表,而不是数组,对吗?
对于{set i 1}{$i<[llength$DataList]}{incr i}{
设置行[lindex$DataList$i]
#$line上的一些更改
lset数据列表$i$行
}
lset
与lreplace
不同,它不需要设置,因为除了返回替换列表之外,它还会更改列表。如果您要更改列表中的每个项目,并且可以通过简单的脚本生成新值,则可以使用lmap
(列表映射)。该命令将创建一个项目数与原始列表相同的列表,其中新列表中的每个项目都具有脚本值,并插入原始列表中相应项目的值。假设要为列表中的每个项目计数字符:
set list [list can be produced]
lmap item $list {
list $item [string length $item]
}
# => {{can 3} {be 2} {produced 8}}
set list [list can be produced]
lreplace $list 0 1 can sometimes but not always be
# => {can sometimes but not always be produced}
set list [list the new value can be produced]
lreplace $list 1 1
# => {the value can be produced}
请注意,此命令不会更改列表的值:您需要重新分配它以更新值
linsert
(列表插入)在不删除任何现有元素的情况下向列表中添加新项目:
set list [list can be produced]
linsert $list 1 not
# => {can not be produced}
lreplace
(列表替换)对于更改列表中元素数量的插入非常有用:
set list [list can be produced]
lmap item $list {
list $item [string length $item]
}
# => {{can 3} {be 2} {produced 8}}
set list [list can be produced]
lreplace $list 0 1 can sometimes but not always be
# => {can sometimes but not always be produced}
set list [list the new value can be produced]
lreplace $list 1 1
# => {the value can be produced}
同样,list
的值不会被linsert
或lreplace
更改
如果您想就地更改列表中的项目,lset
(列表集)是您的朋友:
set list [list the new value can be produced]
lset list 1 correct
# => {the correct value can be produced}
此命令确实会更改列表
的值,因为它属于设置命令系列,这些命令采用变量名称而不是变量值,并以某种方式修改值
文档:,,,如果您要更改列表中的每一项,并且可以通过简单的脚本生成新值,lmap
(列表映射)是一种方法。该命令将创建一个项目数与原始列表相同的列表,其中新列表中的每个项目都具有脚本值,并插入原始列表中相应项目的值。假设要为列表中的每个项目计数字符:
set list [list can be produced]
lmap item $list {
list $item [string length $item]
}
# => {{can 3} {be 2} {produced 8}}
set list [list can be produced]
lreplace $list 0 1 can sometimes but not always be
# => {can sometimes but not always be produced}
set list [list the new value can be produced]
lreplace $list 1 1
# => {the value can be produced}
请注意,此命令不会更改列表的值:您需要重新分配它以更新值
linsert
(列表插入)在不删除任何现有元素的情况下向列表中添加新项目:
set list [list can be produced]
linsert $list 1 not
# => {can not be produced}
lreplace
(列表替换)对于更改列表中元素数量的插入非常有用:
set list [list can be produced]
lmap item $list {
list $item [string length $item]
}
# => {{can 3} {be 2} {produced 8}}
set list [list can be produced]
lreplace $list 0 1 can sometimes but not always be
# => {can sometimes but not always be produced}
set list [list the new value can be produced]
lreplace $list 1 1
# => {the value can be produced}
同样,list
的值不会被linsert
或lreplace
更改
如果您想就地更改列表中的项目,lset
(列表集)是您的朋友:
set list [list the new value can be produced]
lset list 1 correct
# => {the correct value can be produced}
此命令确实会更改列表
的值,因为它属于设置命令系列,这些命令采用变量名称而不是变量值,并以某种方式修改值
文档:,,,为什么不更改数据列表?我在代码中替换$行,然后将其追加回list@Rocker假设您拥有列表{543}
。当第一个循环中的i=1
时,[lindex$DataList 1]
将给出4
(Tcl基于0)lreplace$DataList 1 1 4
将用索引1
替换元素,并将其值替换为4
。。。已经是4了。@Jerry,因为lreplace
接受一个列表值