導入
「決まった回数」ではなく「ある条件を満たすまで」繰り返したいことがあります。たとえば「ファイルの終わりに達するまで読み続ける」「入力が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-COUNT は PIC 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上では実行時間の上限で強制停止されることが多いです)。