Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在TCL中按索引更改列表中的项_Arrays_List_File_Tcl - Fatal编程技术网

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
接受一个列表值