ループ処理を途中で中断したり処理をスキップするには、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と自分自身以外の数値では割れない数値
例.
「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 "
」は実行されずに次のループにスキップします。
その他の制御構造に関連するコマンドは、必要に応じて以下の記事を参考にしてください。
コメント