導入
レッスン26で「1から5まで表示する」ために、カウンタの初期化・条件判定・更新を自分で書く必要がありました。これを1文にまとめてくれるのが PERFORM VARYING です。多くの言語の for 文に相当します。
説明
01 WS-I PIC 9(2).
PROCEDURE DIVISION.
PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I > 5
DISPLAY WS-I
END-PERFORM.
STOP RUN.
実行結果はレッスン27と同じく、01 から 05 が1行ずつ表示されます(WS-I が PIC 9(2) なので2桁ゼロ詰め)。
FROM 1… カウンタWS-Iの初期値。BY 1… 1回ごとの増分(増やす量)。UNTIL WS-I > 5… この条件を満たしたら終了。
PERFORM VARYING は「初期化・条件・増分」の3つが1行にまとまっているのが最大の利点です。他の言語の for (i = 1; i <= 5; i++) に相当する内容が、PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I > 5 という英語に近い1文で表現されています。
第6章で学ぶ OCCURS句(配列) を走査するときにも、このPERFORM VARYINGが定番の書き方になります。
*> 先取りしたイメージ(第6章で詳しく扱う)
PERFORM VARYING WS-IDX FROM 1 BY 1 UNTIL WS-IDX > 10
DISPLAY WS-SCORES(WS-IDX)
END-PERFORM.
さらに、VARYING は2つ以上のカウンタを同時に制御することもできます(AFTER 句を使う多重ループ)。
PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I > 3
AFTER WS-J FROM 1 BY 1 UNTIL WS-J > 2
DISPLAY WS-I " - " WS-J
END-PERFORM.
*> 1-1, 1-2, 2-1, 2-2, 3-1, 3-2 の順に表示される(二重ループ)
AFTER を使った多重ループは、第6章の多次元の表(ネストしたOCCURS)を走査するときにまさに使う書き方です。
試すには
PERFORM VARYING を使って、1 から 10 までの合計を計算するプログラムを書いてみましょう(ループの中で ADD WS-I TO WS-SUM のように積み上げていきます)。