Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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
String TCL将列表转换为字符串,每X个列表元素使用新行_String_List_Tcl - Fatal编程技术网

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中都有效的替代解决方案。每一行是否应该以逗号结尾?不,这不是必需的,每一行是否应该以逗号结尾?不,这不是必需的,