在我的下面的代码中,我在for
循环中生成一个字符串列表,如下所示:
set section 5;
set value 2;
set value_range_new "";
for { set i [expr -$section-1]} {$i <= $section} {incr i} {
if {$i < [expr -$section]} {
lappend value_range_new "\<[expr [expr $i+1]*$value]";
} elseif {$i == $section} {
lappend value_range_new "\>[expr $i*$value]";
} else {
lappend value_range_new "\[[expr $i*$value]\,[expr [expr $i +1]*$value]\)";
}
}
然后,如果我列出了puts
,结果如下:
<-10 {[-10,-8)} {[-8,-6)} {[-6,-4)} {[-4,-2)} {[-2,0)} {[0,2)} {[2,4)} {[4,6)} {[6,8)} {[8,10)} >10
令人困惑的是,我不明白{}
的来源。如果我手动定义列表如下:
set a "\<-8 \[-8,-6\) \[-6,-4\) ";
投注结果没有{}
。那么我的代码有什么问题,以及如何删除/
答案 0 :(得分:1)
在Tcl中,您需要知道哪些命令要使用列表以及哪些命令要使用字符串。 lappend
是一个列表命令。 puts
需要一个字符串。当您给puts
列表时,Tcl会将列表转换为其字符串表示形式。这意味着您将看到一些额外的大括号和可能的反斜杠来保护具有特殊字符的列表元素(如[
和]
)。
您可以使用join
命令轻松地将列表转换为字符串。
对于构建字符串,format
命令有助于提高可读性。
此外,您不需要下一个expr
命令,请使用括号;和brace your expressions:
set section 5;
set value 2;
set value_range_new "";
for { set i [expr {-$section-1}]} {$i <= $section} {incr i} {
set this [expr {$i * $value}]
set next [expr {($i + 1) * $value}]
if {$i < -$section} {
lappend value_range_new [format {<%d} $next]
} elseif {$i == $section} {
lappend value_range_new [format {>%d} $this]
} else {
lappend value_range_new [format {[%d,%d)} $this $next]
}
}
puts [join $value_range_new]
输出
<-10 [-10,-8) [-8,-6) [-6,-4) [-4,-2) [-2,0) [0,2) [2,4) [4,6) [6,8) [8,10) >10
答案 1 :(得分:1)
算法的较短变体。实际上不需要if
。
set section 5;
set value 2;
set this [expr {-$section * $value}]
set value_range_new [format {<%d} $this]
for {set i -$section} {$i < $section} {incr i} {
lappend value_range_new [format {[%d,%d)} $this [incr this $value]]
}
lappend value_range_new [format {>%d} $this]
puts [join $value_range_new]