【COBOL学習|豆知識】ベテランが教える「インラインPERFORM」の正しい脱出術:EXIT PERFORMのスコープを理解する

1. 導入:なぜループ制御が重要なのか

COBOLの歴史において、かつてループ処理といえば段落(Paragraph)に飛ばすPERFORM文が主流でしたが、現代のCOBOL(ISO規格)では、より直感的なインラインPERFORMが好まれます。しかし、多重ループの中で「特定の条件でループを抜けたい」と考えたとき、`EXIT PERFORM`がどの範囲まで影響するのかを曖昧にしていると、思わぬ無限ループや論理バグを生む原因となります。本記事では、このスコープの仕組みを整理します。

2. 基礎知識:インラインPERFORMの仕組み

インラインPERFORMとは、`PERFORM … END-PERFORM`で囲まれた範囲を指します。`EXIT PERFORM`命令は、実行された瞬間に「その命令が記述されている最も内側のインラインPERFORM」を強制的に終了させ、`END-PERFORM`の直後の行へ制御を移します。この「最も内側」というルールを理解することが、複雑なネスト構造を安全に制御する鍵となります。

3. 実装と解決策:多重ループの制御

多重ループ構造において、内側のループから「外側のループも含めて一度に脱出したい」という場面はよくあります。しかし、`EXIT PERFORM`はあくまで「1階層」しか抜けません。もし外側まで一気に抜けたい場合は、単純に`EXIT PERFORM`を繰り返すのではなく、制御フラグを用いるか、あるいは`GO TO`文でループの外へ抜ける設計を検討するのが、現場での保守性を高めるコツです。

4. サンプルプログラム

以下のコードは、内側のループのみを`EXIT PERFORM`で正常に抜ける様子を示したものです。

PROCEDURE DIVISION.
MAIN-LOGIC.

  • 外側のループ(1から3まで繰り返す)

PERFORM VARYING I FROM 1 BY 1 UNTIL I > 3
DISPLAY “外側ループ: ” I

  • 内側のループ(1から5まで繰り返す)

PERFORM VARYING J FROM 1 BY 1 UNTIL J > 5

  • Jが3になったら内側ループのみを終了する

IF J = 3 THEN
DISPLAY ” 内側ループを脱出します”
EXIT PERFORM
END-IF
DISPLAY ” 内側ループ: ” J
END-PERFORM
END-PERFORM.
STOP RUN.

5. 応用・注意点:現場でのトラブル回避

注意点:
`EXIT PERFORM`は、あくまで「その場にある最も近い`END-PERFORM`まで飛ぶ」という性質上、安易な多用は「スパゲッティコード」を招くリスクがあります。特に、ループの脱出条件が複数箇所に散らばっていると、後からコードを読んだ際にどこでループが終わるのか把握しづらくなります。

現場の知恵:
もしループの脱出条件が複雑になる場合は、`EXIT PERFORM`に頼り切るのではなく、`PERFORM`文の`UNTIL`条件式自体を整理し、フラグ変数を用いて制御する方が、後任者にとってデバッグしやすいコードになります。また、`EXIT PERFORM CYCLE`(現在の反復をスキップして次の反復へ進む)と混同しないよう、仕様書と突き合わせて実装することをお勧めします。

コメント

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