2

while ループに for ループがあります。for ループの while を中断する条件があります。

コードは次のとおりです。

while {[gets $thefile line] >= 0} {
   for {set i 1} {$i<$count_table} {incr i} {
   if { [regexp "pattern_$i" $line] } {
      for {set break_lines 1} {$break_lines<$nb_lines} {incr break_lines} {
         if {[gets $thefile line_$break_lines] < 0} break
      }
   }
   #some other process to do
}

$nb_lines解析されたファイルをスキップして、さらに他のことをしたいと思います。ここで break は for ループを壊すため、機能しません。

for ループで while ループが壊れることはありますか? しかし、休憩は1行(またはそれ以上)のためだけです。休憩後にファイルを解析し続けて、行をさらに処理したい

ありがとう

4

2 に答える 2

3

このbreakコマンド (およびそれcontinueも) は、マルチレベル ループの終了を行いません。IMO、最も簡単な回避策は、コードをリファクタリングreturnして、外側のループを終了できるようにすることです。ただし、それができない場合は、代わりに次のようなものを使用できます (8.5 以降の場合):

proc magictrap {code body} {
    if {$code <= 4} {error "bad magic code"}; # Lower values reserved for Tcl
    if {[catch {uplevel 1 $body} msg opt] == $code} return
    return -options $opt $msg
}
proc magicthrow code {return -code $code "doesn't matter what this is"}

while {[gets $thefile line] >= 0} {
   magictrap 5 {
      for {set i 1} {$i<$count_table} {incr i} {
         if { [regexp "pattern_$i" $line] } {
            for {set break_lines 1} {$break_lines<$nb_lines} {incr break_lines} {
               if {[gets $thefile line_$break_lines] < 0} {magicthrow 5}
            }
         }
      }
   }
   #some other process to do
}

5特別なものではありません (これは単なるカスタムの結果コードです。Tcl は 0 ~ 4 を予約していますが、その他はそのままにしておきます)、プログラム内の他の用途と重複しないように、自分で値を選択する必要があります。(8.4 以前でも動作するようにコードをやり直すことはほとんど可能ですが、そこで例外を再スローするのはかなり複雑です。)

カスタム例外コードは、Tcl の「深い魔法」の部分であることに注意してください。可能であれば、代わりに通常のリファクタリングを使用してください。

于 2012-07-17T20:09:07.957 に答える
2

おそらく明らかですが、追加の変数 ( go_on) を使用して while を中断できます。

while {[gets $thefile line] >= 0} {
  set go_on 1
  for {set i 1} {$i<$count_table && $go_on} {incr i} {
    if { [regexp "pattern_$i" $line] } {
      for {set break_lines 1} {$break_lines<$nb_lines && $go_on} {incr break_lines} {
        if {[gets $thefile line_$break_lines] < 0} { set go_on 0 }
      }
     }
   }
   #some other process to do
}
于 2012-07-17T13:39:46.947 に答える