Tcl – ループの中断とスキップ -break, continue-

ループ処理を途中で中断したり処理をスキップするには、breakコマンドとcontinueコマンドを使います。

breakコマンド

breakコマンドはループ処理を中断してループから抜けます。

[サンプル1:echo3.tcl] 入力した文字を表示する

#!/bin/sh
# the next line restarts using tclsh \
exec tclsh "$0" "$@"

puts "入力した文字を表示します。"

while {1} {

    puts [gets stdin]
    puts -nonewline "終了しますか?(y/n):"
    flush stdout

    set var [gets stdin]
    if {$var == y} {
        break    ;# ループから抜ける
    }
}
puts "終了しました。"

[実行例]

$ ./echo3.tcl
入力した文字を表示します。
hello!
hello!
終了しますか?(y/n):n
stop!
stop!
終了しますか?(y/n):y
終了しました。

[説明]

このプログラムは「y」が入力されるまで繰り返します。

メモ

Tclには他の言語で実装されているような、「do-while」、「repeat-while」といった後置判定のコマンドは用意されていません。

ループ本体を1回実行してから判定するようなループ構造が必要な場合は、以下のように無限ループを利用することで「do-while」、「repeat-while」に相当する処理を記述できます。

while {1} {
    処理1
処理2


処理N if {条件式} { break } }

[サンプル2: prime_number.tcl] 素数判定プログラム

#!/bin/sh
# the next line restarts using tclsh \
exec tclsh "$0" "$@"

# 素数判定プログラム

set flag 0    ;# 割り切れるかどうかの判定用

puts "1より大きい数値を入力してください。"
set n [gets stdin]

if {$n < 2} {
    puts "1より大きい数値と言いましたよねぇ。終了します。"
    exit
} else {
    # 素数判定
    for {set i 2} {$i < $n} {incr i} {
        if {$n % $i == 0} {
            set flag 1    ;# 割り切れた
            break
        }
    }
    # 判定結果
    if {$flag == 0} {
        puts "$n は素数です。"
    } else {
        puts "$n は素数ではありません。"
    }
}

[実行例]

$ ./prime_number.tcl
1より大きい数値を入力してください。
5
5 は素数です。
$ ./prime_number.tcl 1より大きい数値を入力してください。 6 6 は素数ではありません。
$ ./prime_number.tcl 1より大きい数値を入力してください。 1 1より大きい数値と言いましたよねぇ。終了します。

[説明]

素数とは、以下の条件を満たす数値です。

  1. 1より大きい数値 かつ
  2. 1と自分自身以外の数値では割れない数値

例.
「5」は1と5以外の数値で割れないので素数です。
「6」は1,2,3,6で割れるので素数ではない。

サンプルプログラムは、入力した数値を2以上の数値で割っていき、割り切れた時点で、フラグ「1」を立ててbreakコマンドでループを抜けるようにしています。

continueコマンド

continueコマンドは実行中のループ処理を停止して次のループ処理にスキップします。

[サンプル:skip.tcl]

#!/bin/sh
# the next line restarts using tclsh \
exec tclsh "$0" "$@"

# continueの使い方

puts "1から4をスキップする。"
for {set i 1} {$i <= 10} {incr i} {
    if {$i < 5} {
        continue
    }
    puts -nonewline "$i "
    flush stdout
}

puts "\n\n偶数をスキップする。"
for {set i 1} {$i <= 10} {incr i} {
    if {$i % 2 == 0} {
        continue
    }
    puts -nonewline "$i "
    flush stdout
}
puts ""

[実行例]

$ ./skip.tcl
1から4をスキップする。
5 6 7 8 9 10 

偶数をスキップする。
1 3 5 7 9 

[説明]

ifコマンドの条件に一致する場合、「 puts -nonewline "$i " 」は実行されずに次のループにスキップします。


その他の制御構造に関連するコマンドは、必要に応じて以下の記事を参考にしてください。

コメント

タイトルとURLをコピーしました