導入
プログラムを組んでいると、「とりあえず処理を一度実行してから、終了条件を判定したい」という場面によく遭遇します。例えば、画面から入力を受け取る処理や、ファイルからデータを1件読み込んでから処理を継続するか判断する場合などがそうです。標準的なPERFORM UNTIL文(WITH TEST BEFORE)では、開始時に条件が合致していると一度も実行されませんが、WITH TEST AFTER句を使えば、条件に関わらず「最低一回は必ず処理を実行する」というロジックを簡潔に書くことができます。
基礎知識
COBOLのPERFORM文には、繰り返しを制御する仕組みが備わっています。通常、何も指定しない場合は「前判定(TEST BEFORE)」として扱われ、繰り返し処理の先頭で条件を確認します。これに対し、「後判定(TEST AFTER)」は、処理の最後に条件を確認します。これは他言語でいう「do-while」や「repeat-until」に近い動きです。
実装/解決策
実装は非常にシンプルです。PERFORM文の末尾に「WITH TEST AFTER」と記述するだけです。これにより、ループ内の処理が完了した後にUNTIL句の条件式が評価されるようになります。もし最初のループで終了条件を満たしていても、一度実行されているため、意図した通りの「最低一回の実行」が保証されます。
サンプルプログラム
以下のコードは、カウンタが10を超えるまでループする例です。WITH TEST AFTERの効果を確認してみてください。
IDENTIFICATION DIVISION.
PROGRAM-ID. TEST-AFTER-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-CNT PIC 9(02) VALUE 0.
PROCEDURE DIVISION.
> WITH TEST AFTER を指定することで、最低一回は必ず処理が通る
PERFORM 100-LOOP-PARA WITH TEST AFTER UNTIL WS-CNT > 10.
STOP RUN.
100-LOOP-PARA.
ADD 1 TO WS-CNT.
DISPLAY “現在のカウント値は: ” WS-CNT.
> 処理の最後で条件判定が行われるため、
> 11回目のループ処理まで実行されてから終了する。
EXIT.
応用・注意点
現場での注意点として、無限ループの危険性が挙げられます。TEST AFTERを使用する場合、ループ内の処理で必ずUNTILの判定条件(今回の例ではWS-CNT)が更新されるように設計しなければなりません。また、古いCOBOL規格では対応していない環境もあるため、レガシーなメインフレーム環境で開発を行う際は、コンパイラの仕様を確認してください。
また、処理を一度だけ行うという特性を活かし、入力チェックの再試行処理などに応用すると、コードの可読性が格段に向上します。ぜひ積極的に活用してみてください。

コメント