本文へスキップ
BecomeCoder

COBOLコース · 第5章 繰り返しと構造化 ― PERFORM · レッスン27

PERFORM UNTIL ― 条件によるループ(while相当)

ブラウザで完結

導入

「決まった回数」ではなく「ある条件を満たすまで」繰り返したいことがあります。たとえば「ファイルの終わりに達するまで読み続ける」「入力が0になるまで処理を続ける」といった場面です。これに使うのが PERFORM UNTIL で、多くの言語の while に相当します。

説明

       01  WS-COUNT             PIC 9(2)     VALUE 1.

       PROCEDURE DIVISION.
           PERFORM UNTIL WS-COUNT > 5
               DISPLAY WS-COUNT
               ADD 1 TO WS-COUNT
           END-PERFORM.
           STOP RUN.

実行結果(WS-COUNTPIC 9(2) なので、各行が2桁ゼロ詰めで表示されます):

01
02
03
04
05
  • PERFORM UNTIL 条件 … 「条件が真になるまで」繰り返します。裏返せば、条件が偽の間は繰り返し続けるということです。
  • 条件は繰り返しの前に評価されます(他の言語の while と同じ「前判定」)。そのため、最初から条件が真であれば、中身は一度も実行されません。
  • ループの中で ADD 1 TO WS-COUNT のように、条件に関わる変数を必ず更新すること。これを忘れると無限ループになってしまいます。

WITH TEST AFTER を付けると、多くの言語の do-while(後判定)に相当する動きになります。

           PERFORM WITH TEST AFTER UNTIL WS-COUNT > 5
               DISPLAY WS-COUNT
               ADD 1 TO WS-COUNT
           END-PERFORM.
      *>  「後判定」なので、中身が必ず最低1回は実行される
  • 既定(WITH TEST AFTER を書かない場合)は WITH TEST BEFORE(前判定)です。

第7章で学ぶファイル処理では、「ファイルの終わりに達するまで読み続ける」という定番パターンでこのPERFORM UNTILが頻繁に登場します。

      *> 先取りしたイメージ(第7章で詳しく扱う)
           PERFORM UNTIL WS-EOF-FLAG = "Y"
               READ SALES-FILE
                   AT END MOVE "Y" TO WS-EOF-FLAG
               END-READ
           END-PERFORM.

試すには

WS-COUNT を1から10まで数え、5より大きくなったら止める PERFORM UNTIL を書いてみましょう。うっかり ADD 1 TO WS-COUNT を書き忘れると無限ループになる、という感覚もぜひ体験してみてください(Playground上では実行時間の上限で強制停止されることが多いです)。

実際に動かしてみよう

下のエディタにCOBOLを書いて「実行」を押すと、学習用シミュレータが DISPLAY の出力を表示します(本物のGnuCOBOLではなく、教材の範囲を再現した軽量エンジンです)。PICTURE句の桁数・ゼロ詰め・切り捨てなどCOBOLらしい挙動もそのまま体験できます。本文の例を書き換えて動かしてみましょう(ファイル処理やCALLなど一部の機能は対象外です)。

COBOL — ブラウザ内で実行(学習用シミュレータ)

COBOLの教材サブセットを動かす学習用シミュレータを読み込みます(本物のGnuCOBOLではなく、動きを再現した軽量な自作エンジンです)。
スクロールして表示された時点でも自動で読み込まれます。