Tcl:字符串列表的奇怪行为

时间:2015-02-27 02:39:23

标签: string list tcl

在我的下面的代码中,我在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\) ";

投注结果没有{}。那么我的代码有什么问题,以及如何删除/

2 个答案:

答案 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]