String TCL将列表转换为字符串,每X个列表元素使用新行
我有一个很大的列表,我把它放在一个没有任何换行符的文件中:String TCL将列表转换为字符串,每X个列表元素使用新行,string,list,tcl,String,List,Tcl,我有一个很大的列表,我把它放在一个没有任何换行符的文件中: puts $output_file ", [format " %s" [join $elems ","]]" 但是,我需要每8个元素插入一个换行符,因为生成的文件解释不正确 我想知道是否有某种内置的功能可以做到这一点 如果不是的话,我正在考虑一个返回带换行符的字符串的过程,或者一个函数每8个元素写入一个文件 有人有同样的问题吗 TCL中是否存在类似的情况: 谢谢。您可以使用lrange命令获取所需的列表元素范围,并将其循环到最后 se
puts $output_file ", [format " %s" [join $elems ","]]"
但是,我需要每8个元素插入一个换行符,因为生成的文件解释不正确
我想知道是否有某种内置的功能可以做到这一点
如果不是的话,我正在考虑一个返回带换行符的字符串的过程,或者一个函数每8个元素写入一个文件
有人有同样的问题吗
TCL中是否存在类似的情况:
谢谢。您可以使用
lrange
命令获取所需的列表元素范围,并将其循环到最后
set input {1 2 3 4 5 6 7 8 9 10 11 12}
for {set startIdx 0} {$startIdx<[llength $input]} {incr startIdx 8} {
set endIdx [expr {$startIdx+7}]
puts [lrange $input $startIdx $endIdx]
}
即使
endIdx
超出了列表的实际大小,也不是问题。这就是原因,当循环第二次运行时,endIdx
将为15,而Tcl
将只返回列表元素,最多返回第11个索引元素 您可以使用lrange
命令获取所需的列表元素范围,并将其循环到最后
set input {1 2 3 4 5 6 7 8 9 10 11 12}
for {set startIdx 0} {$startIdx<[llength $input]} {incr startIdx 8} {
set endIdx [expr {$startIdx+7}]
puts [lrange $input $startIdx $endIdx]
}
即使
endIdx
超出了列表的实际大小,也不是问题。这就是原因,当循环第二次运行时,endIdx
将为15,而Tcl
将只返回列表元素,最多返回第11个索引元素 一种方法是定义一个命令,当作为协同程序运行时,该命令将一次返回列表的一部分(“块”)。此命令采用列表、长度和可选的起始索引(默认为0)。当它耗尽列表时,它将永远返回一个空列表
proc chunk {list n {i 0}} {
yield
set m [expr {$n - 1}]
while 1 {
yield [lrange $list $i $i+$m]
incr i $n
}
}
创建coroutine命令,提供列表和长度:
coroutine nextchunk chunk $input 8
像这样使用它:
for {set chunk [nextchunk]} {[llength $chunk] > 0} {set chunk [nextchunk]} {
puts [join $chunk ", "]
}
文档:,,,,,一种方法是定义一个命令,当作为协同程序运行时,该命令将一次返回列表的一部分(“块”)。此命令采用列表、长度和可选的起始索引(默认为0)。当它耗尽列表时,它将永远返回一个空列表
proc chunk {list n {i 0}} {
yield
set m [expr {$n - 1}]
while 1 {
yield [lrange $list $i $i+$m]
incr i $n
}
}
创建coroutine命令,提供列表和长度:
coroutine nextchunk chunk $input 8
像这样使用它:
for {set chunk [nextchunk]} {[llength $chunk] > 0} {set chunk [nextchunk]} {
puts [join $chunk ", "]
}
文档:,,,,,,,感谢您,不管元素需要用逗号分隔,使用lrange?puts“,[格式“%s”[加入[lrange$liste$startIdx$endIdx],“]]”都可以,谢谢!简单的
[join[lrange$liste$startIdx$endIdx],“]
也可以。。。没有格式。谢谢,不管元素需要用逗号分隔,使用lrange?puts“,[格式“%s”[加入[lrange$liste$startIdx$endIdx],“]]都可以,谢谢!简单的[join[lrange$liste$startIdx$endIdx],“]
也可以。。。没有格式。很好的解决方案,但我看到了以下错误消息:在循环外调用了“break”
@glennjackman:它在tkcon
中对我有效,因为它会处理异常。在其他shell中,会显示该错误消息。提醒您始终在不同的shell中测试代码。。。我发布了一个适用于所有三种shell的替代解决方案。这是一个不错的解决方案,但我看到了以下错误消息:在循环外调用了“break”
@glennjackman:它在tkcon
中对我有效,因为它会处理异常。在其他shell中,会显示该错误消息。提醒您始终在不同的shell中测试代码。。。我已经发布了一个在所有三个shell中都有效的替代解决方案。每一行是否应该以逗号结尾?不,这不是必需的,每一行是否应该以逗号结尾?不,这不是必需的,