導入:なぜ「EXIT PERFORM」のレベル指定が重要なのか
COBOL開発において、最も頭を悩ませるのが「多重ループ(入れ子になったPERFORM)」の制御です。特に、深い階層でエラーが発生した際、すべてのループを即座に中断して処理を終了させたい場面があるでしょう。かつてはGO TO文を使って無理やりループの外へ飛び出す手法がとられていましたが、これはプログラムの流れを複雑にし、保守性を低下させる原因でした。COBOL 2002で導入された「EXIT PERFORM level-number」を使えば、美しい構造化を保ったまま、スマートに多重ループから脱出することが可能です。
基礎知識:構造化制御とループ脱出の仕組み
COBOLのPERFORM文は、特定の処理を繰り返すための強力なツールですが、複数のループが重なると制御が複雑になります。
通常、EXIT PERFORMは「現在のループ」を終了させるものですが、これに「レベル番号(level-number)」を指定することで、「自分を含めて何階層のループを抜けるか」を明示的に指示できます。これにより、エラー検知時に一番外側のループまで一気に戻る、といった制御が非常にスッキリと記述できるようになります。
実装と解決策:脱出レベルの指定方法
基本的な考え方は「内側から見ていくつ外側のループまで抜けるか」を指定することです。例えば、3重ループの最深部から一気に抜けたい場合、「EXIT PERFORM 3」と記述することで、3つ分のループを即座に終了させ、その直後の命令へ制御を移せます。これにより、フラグ変数を何個も用意してチェックするような冗長なコードを書く必要がなくなります。
サンプルプログラム:多重ループからの脱出
以下のコードは、3重ループの中で特定の条件を満たした際に、一気に処理を中断する例です。
IDENTIFICATION DIVISION.
PROGRAM-ID. EXIT-PERFORM-SAMPLE.
PROCEDURE DIVISION.
> 外側のループ(レベル3)
PERFORM VARYING I FROM 1 BY 1 UNTIL I > 3
DISPLAY “外側ループ: ” I
> 中間のループ(レベル2)
PERFORM VARYING J FROM 1 BY 1 UNTIL J > 3
DISPLAY ” 中間ループ: ” J
> 内側のループ(レベル1)
PERFORM VARYING K FROM 1 BY 1 UNTIL K > 3
DISPLAY ” 内側ループ: ” K
> Kが2かつJが2になったら全ループを脱出する
IF J = 2 AND K = 2 THEN
DISPLAY “— 異常検知!全ループを脱出します —”
EXIT PERFORM 3
END-IF
END-PERFORM
END-PERFORM
END-PERFORM.
DISPLAY “ループ脱出後の処理を実行中…”.
STOP RUN.
応用・注意点:現場で役立つアドバイス
この機能を使う際に注意すべき点がいくつかあります。
第一に、コンパイラの対応状況です。古い環境や特定のベンダーのコンパイラでは、COBOL 2002の全仕様が実装されていない場合があります。使用前に必ず開発環境の言語仕様を確認してください。
第二に、「脱出レベル」の数え間違いです。レベル数はコードの見た目と一致している必要があります。複雑すぎる入れ子は、たとえEXIT PERFORMで抜けられたとしても、コードの可読性を下げます。「3重までが限界」など、チーム内でルールを決めておくのがベテランの知恵です。
この機能を適切に使いこなすことで、あなたのコードは格段に読みやすく、エラーに強いものへと進化するはずです。ぜひ活用してみてください。

コメント