【问题标题】:Nested for loop issue TCL嵌套for循环问题TCL
【发布时间】:2014-01-19 02:28:56
【问题描述】:
#!/bin/sh
# This is a trial program

puts "++++++++++++++++++++++++++++++++++++++++++++++++++"
set y "0.0.0.0"

set z [split $y "."]
puts "z=$z"
lreplace $z 0 5
puts "z $z"
set v [llength $z]
puts "length of array=  $v"
puts "in the loop-------->\n"
puts " "
incr v -1
puts $v
for {set ml $v } { $ml >= 0} { puts "$ml =ml"} {
    for { set nl [lindex $z $ml]} { $nl >=4} { puts "$nl=nl"} {
        puts $nl
        after 2000
        lset z  $ml $nl
        incr $nl
    }
    after 2000
    incr ml -1
}               

我无法进入第二个 for 循环,这是格式问题吗? 给了我一些奇怪的错误。我添加了 sleep 只是为了检查发生了什么,所以忽略它。

【问题讨论】:

  • 你有什么理由使用lreplace $z 0 5
  • +1 Jerry 的评论:lreplace $z 0 5 在这个程序中实际上并没有做任何事情。该命令基于 z 中的元素创建一个结果列表,其中删除了(不存在的)索引 5 之前的所有元素,然后您不要在任何地方分配此结果列表。
  • 如果您打算用 5:s 替换 0:s,这会更好:set z [lmap elem $z { expr { $elem == 0 ? 5 : $elem } }]
  • 应该是incr nl 而不是incr $nl

标签: loops for-loop nested tcl


【解决方案1】:

在您的代码中,您的内部循环仅评估 nl >=4。 nl 将从[lindex $z $ml]初始化为0

既然你要增加 $nl,我猜你应该改变这一行:

for { set nl [lindex $z $ml]} { $nl >=4} { puts "$nl=nl"} {

改为:

for { set nl [lindex $z $ml]} { $nl <=4} { puts "$nl=nl"} {

【讨论】:

  • 谢谢尼尔。我试过了,nl 永远不会增加。 0=nl 0=nl 0=nl 0=nl ^C
  • 事实上z中的第0个元素也没有被替换:(
  • z=0 0 0 0 z 0 0 0 0 循环中的数组长度= 4-------->
  • 你的incr语句好像有点奇怪$nl是一个值,你可能需要使用incr nl
  • 完全正确!刚刚想通了。非常感谢您的意见
【解决方案2】:

您是否打算这样做?

# This is a trial program

puts "++++++++++++++++++++++++++++++++++++++++++++++++++"
set y "0.0.0.0"

set z [split $y "."]
puts "\$z=$z"
set v [llength $z]
# the term 'array' means associative array in Tcl, better use 'list'
puts "length of list=  $v"
puts "in the loop-------->\n\n"
incr v -1
puts "\$v=$v"
for {set ml $v} {$ml >= 0} {incr ml -1} {
    for {set nl [lindex $z $ml]} {$nl <= 4} {incr nl} {
        lset z $ml $nl
        puts $z
    }
}

请注意,我已将incr 命令调用移至for 命令调用的第三个参数(next 命令字符串,如文档所述)。您可以将任何您想在每次迭代结束时运行的东西放在那里,包括您所做的puts 命令,但将循环控制更改命令(无论它们可能是什么)放在那里是一种惯例和良好做法,并且其他不多。

【讨论】:

  • 您需要更改您的#! 行。
  • 是的,我只是从 OP 的代码中复制了它。我想如果它对他有用,我就把它留在里面。但现在我想我会删除它以避免混淆。感谢您指出这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多