導入
COBOL開発において、特定の処理を一定回数だけ繰り返したい場面は多々あります。例えば、帳票の行数制御や、配列(テーブル)の全要素に対する初期化処理などです。このような場合、単純にコードを並べるのではなく、PERFORM … TIMES 句を活用することで、プログラムを簡潔に保ち、保守性を高めることができます。今回は、この制御構文の正しい使い方と、現場で知っておくべき仕様のポイントを解説します。
基礎知識
PERFORM … TIMES 句は、指定した回数だけ段落(PARA)や節(SECTION)を繰り返し実行する構文です。
この命令の最大の特徴は、「繰り返し回数が実行開始時に決定される」という点です。ループの途中でループ回数を管理している変数の値を変更しても、実行回数に影響を与えることはありません。これは、意図しない無限ループや、回数計算のバグを防ぐための非常に安全な設計となっています。
実装/解決策
実装の基本は「回数」を指定することです。回数には、直接「10」のような数値定数を書くこともできますし、数値型のデータ項目を指定することも可能です。
現場では、配列のサイズを定義した定数や、入力データによって動的に決まる回数変数を指定するのが一般的です。
サンプルプログラム
以下のサンプルは、指定した回数分、カウンタをインクリメントして出力する簡単なプログラムです。コピー&ペーストして、お手元の環境で試してみてください。
IDENTIFICATION DIVISION.
PROGRAM-ID. PERFORM-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
- 繰り返し回数を定義
01 WS-LOOP-COUNT PIC 9(02) VALUE 5.
- 現在のループ回数を保持
01 WS-INDEX PIC 9(02) VALUE 0.
PROCEDURE DIVISION.
DISPLAY “— 処理開始 —“.
- WS-LOOP-COUNTに設定された回数(5回)だけ繰り返す
PERFORM 100-PRINT-PROC WS-LOOP-COUNT TIMES.
DISPLAY “— 処理終了 —“.
STOP RUN.
100-PRINT-PROC.
- 処理回数をカウントアップ
ADD 1 TO WS-INDEX.
DISPLAY “現在のループ回数: ” WS-INDEX.
- ループ中にWS-LOOP-COUNTを書き換えても実行回数には影響しない
MOVE 99 TO WS-LOOP-COUNT.
応用・注意点
現場での開発で陥りやすいのが、「入れ子(ネスト)構造」の管理です。PERFORM文の中にさらにPERFORM文を書くことは可能ですが、多重になりすぎると可読性が極端に低下します。その場合は、適切な単位で段落(PARA)に切り出すことを心がけてください。
また、先述の通り、ループの途中で回数用変数を変更しても実行回数は変わりません。もし「条件を満たしたら途中でループを抜けたい」という要件がある場合は、TIMES句ではなく、PERFORM UNTIL句を使用するようにしてください。要件に合わせて適切な制御構文を選択することが、バグの少ないプログラムを書く第一歩です。

コメント