2014-01-19 176 views
0
#!/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 
}    

我不能輸入第二個循環,這是一個格式問題? 給了我一些奇怪的錯誤。我添加了睡眠只是爲了檢查發生了什麼,所以忽略了這一點。嵌套循環問題TCL

+1

是否有任何理由您使用'lreplace $ z 0 5'? – Jerry

+0

+1 Jerry的評論:'lreplace $ z 0 5'實際上並沒有在這個程序中做任何事情。該命令根據z中的元素創建一個結果列表,並刪除所有那些到達(不存在)索引5的元素,然後不在任何地方分配這個結果列表。 –

+0

如果你的目的是用5:s代替0:s,這將會更好地工作:'set z [lmap elem $ z {expr {$ elem == 0? 5:$ elem}}]' –

回答

2

在您的代碼中,您的內循環僅評估如果nl >=4。 NL將[lindex $z $ml]

既然你增加$ NL被初始化爲0,我的猜測是,你應該這行改:

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

此相反:

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

謝謝Niall。我試過了,nl永遠不會增加。 0 = NL 0 = NL 0 = NL 0 = NL ^ C – user3211264

+0

實際上在z中的第0個元素也沒有得到替換:( – user3211264

+0

Z = 0 0 0 0 ž0 0 0 0 陣列的長度= 4 在循環中--------> – user3211264

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命令調用。你可以在每次迭代結束時放置任何你想要運行的東西,包括puts命令,但是這是一個習慣和良好習慣,在那裏有循環控制改變命令(不管它們可能是什麼),並且沒有太多其他。

+0

你會想改變你的'#!'行 –

+0

是的,我只是從OP的代碼中複製出來的,我覺得它是否適用於我,我只是把它放進去。現在我想我會刪除它以避免混淆,謝謝您指出。 –