PERFORM 文は、その PERFORM 文の範囲内にある 1 つ以上の無条件文の実行を制御するために使用する。
PERFORM 文は、配列の各要素を処理するために使用する。
「EXIT 文」セクションも参照。
PERFORM 文では、AFTER 指定を 6 つ使用できる。
この制限は、15 に拡張されている。
これらの制限は必須ではない。PERFORM 文を自由に入れ子にしたり、再帰 (PERFORM 文が、その PERFORM 文を含む手続きを実行すること) したりすることが可能である。現在実行されている、最も内側の PERFORM 文の出口だけが認識される。これらの規則は、PERFORM-TYPE
コンパイラ指令を使用することで変更できる。
PERFORM 文の正しい構成例を次に示す。
PERFORM 文の実行中、identifier-1 への参照は、指定された文の組の実行回数を、identifier-1 が参照するデータ項目の初期値が示す回数から変更できない。
integer-1 はゼロまたは正の整数とし、符号付きでもよい。
および TEST BEFORE が指定、または暗黙指定されている場合、
制御は procedure-name-1 に移らず、PERFORM 文の末尾に移る。
TEST AFTER を指定した場合、PERFORM 文は TEST BEFORE を指定した場合と同様に機能する。ただし、終了条件が検証されるのは、指定された文の組の実行後になる。condition-1 で指定した作用対象に関連付けた添え字付けまたは部分参照は、条件を検証するたびに評価される。
UNTIL EXIT を指定すると、指定された文の組は、その中の何らかの文によって終了させられるまで、繰り返し実行される。外 PERFORM 文の場合、この繰り返しを終了する文は、EXIT PROGRAM および STOP RUN のみである。内
PERFORM 文の場合、EXIT PERFORM 文および GO TO 文を使用して、この繰り返しを終了できる。
index-name-1 を指定する場合、PERFORM 文の実行開始時の identifier-3、index-name-2、または literal-1 の値は、index-name-1 に関連付けた表内の要素の出現番号に対応している必要がある。index-name-3 を指定する場合、PERFORM 文の実行開始時の identifier-6、index-name-4、または literal-3 の値は、index-name-3 に関連付けた表内の要素の出現番号に対応している必要がある。
以下で説明するとおり、index-name-1 または index-name-3 の後続の増加に伴い、指標の値が、index-name-1 または index-name-3 に関連付けた表の範囲を超えてはならない。ただし、PERFORM 文の実行終了時に、index-name-1 に関連付けた指標の値が、関連付けた表の範囲から 1 増分または 1 減分だけ超える場合がある。
identifier-2 または identifier-5 が添え字付けされている場合、一意名が参照するデータ項目の内容が設定または増加されるたびに、その添え字が評価される。identifier-3、identifier-4、identifier-6、identifier-7 が添え字付けされている場合、一意名が参照するデータ項目の内容が設定または増加の処理に使用されるたびに、その添え字が評価される。condition-1 または condition-2 で指定した作用対象に添え字付けまたは部分参照が関連付けられていると、条件が検証されるたびに、その添え字または部分参照が評価される。
以下に、数種類の PERFORM 文の処理について例示する。
単一の一意名が参照するデータ項目を変更する場合、PERFORM 文の初回実行時に、identifier-2 が参照するデータ項目の内容が、literal-1 に設定されるか、identifier-3 が参照するデータ項目の現在の値に設定される。その後、UNTIL 指定の condition-1 が偽になると、指定された文の組が 1 回実行される。次に、identifier-2 が参照するデータ項目の値が、指定された値 (literal-2 の値、または identifier-4 が参照するデータ項目の値) だけ増分または減分され、condition-1 が再度評価される。このサイクルは、この条件が真になるまで継続する。条件が真になった時点で、PERFORM 文の末尾に制御が移る。PERFORM 文の実行開始時に condition-1 が真である場合、制御は PERFORM 文の末尾に移る。詳細については、下図を参照。
2 つの一意名が参照するデータ項目を変更する場合、identifier-2 が参照するデータ項目の内容が、literal-1 に設定されるか、identifier-3 が参照するデータ項目の現在の値に設定される。その後、identifier-5 が参照するデータ項目の内容が、literal-3 に設定されるか、identifier-6 が参照するデータ項目の現在の値に設定される。以下の「TEST BEFORE 指定が 2 つの条件を持つ PERFORM 文の VARYING オプション」の図を参照。
identifier が参照するデータ項目の内容が設定された後、condition-1 が評価される。この結果が真である場合、PERFORM 文の末尾に制御が移る。この結果が偽である場合は、condition-2 が評価される。condition-2 が偽の場合、指定された文の組が 1 回実行される。次に、identifier-5 が参照するデータ項目の内容が、literal-4 によって、または identifier-7 が参照するデータ項目の内容によって増分される。その後、condition-2 が再度評価される。
この評価および増分のサイクルは、condition-2 が真になるまで継続する。condition-2 が真になると、identifier-2 が参照するデータ項目の内容が、literal-2 によって、または identifier-4 が参照するデータ項目の内容によって増分され、identifier-5 が参照するデータ項目の内容が、literal-3 に設定されるか、identifier-6 が参照するデータ項目の現在の値に設定される。その後、condition-1 が再度評価される。condition-1 が真である場合、PERFORM 文の実行は終了する。真でない場合は、condition-1 が真になるまでサイクルが継続する。
PERFORM 文の終了時に、identifier-5 が参照するデータ項目は、literal-3、または identifier-6 が参照するデータ項目の現在の値を含む。identifier-2 が参照するデータ項目には、最後に使用した設定値に 1 つ増分または減分した値が含まれる。ただし、PERFORM 文の実行開始時に condition-1 が真であった場合には、identifier-2 が参照するデータ項目には、literal-1 が含まれるか、identifier-3 が参照するデータ項目の現在の値が含まれる。
単一の一意名が参照するデータ項目を変更する場合、PERFORM 文の実行開始時に、identifier-2 が参照するデータ項目の内容が、literal-1 に設定されるか、identifier-3 が参照するデータ項目の現在の値に設定された後、指定された文の組が 1 回実行される。次に、UNTIL 指定の condition-1 が検証される。この結果が偽の場合、identifier-2 が参照するデータ項目の値は、指定された値 (literal-2、または identifier-4 が参照するデータ項目の値) だけ増分または減分され、指定された文の組が再度実行される。このサイクルは、condition-1 の検証結果が真になるまで継続する。結果が真になると、PERFORM 文の末尾に制御が移る。詳細については、下図を参照。
2 つの一意名が参照するデータ項目を変更する場合、identifier-2 が参照するデータ項目の内容が、literal-1 に設定されるか、identifier-3 が参照するデータ項目の現在の値に設定される。その後、identifier-5 が参照するデータ項目の現在の値が、literal-3 に設定されるか、identifier-6 が参照するデータ項目の現在の値に設定される。次に、指定された文の組が実行される。その後、condition-2 が評価される。この結果が偽の場合、identifier-5 が参照するデータ項目の内容が、literal-4 によって、または identifier-7 が参照するデータ項目の内容によって増分され、指定された文の組が再度実行される。このサイクルは、condition-2 が再度評価されて結果が真になるまで継続する。評価が真になった時点で、condition-1 が評価される。この結果が偽の場合、identifier-2 が参照するデータ項目の内容が、literal-2 によって、または identifier-4 が参照するデータ項目の内容によって増分または減分され、identifier-5 が参照するデータ項目の内容が、literal-3 に設定されるか、identifier-6 が参照するデータ項目の現在の値に設定される。その後、指定された文の組が再度実行される。このサイクルは、condition-1 が再度評価されて結果が真になるまで継続する。結果が真になった時点で、PERFORM 文の末尾に制御が移る。以下の「TEST AFTER 指定が 2 つの条件を持つ PERFORM 文の VARYING オプション」の図を参照。
PERFORM 文の実行が完了すると、AFTER 指定または VARYING 指定が変更した各データ項目には、指定された文の組を最後に実行した時点と同じ値が含まれる。
PERFORM 文に関連付けた、指定された文の組の実行中は、VARYING 変数 (identifier-2 が参照するデータ項目および index-name-1)、BY 変数 (identifier-4 が参照するデータ項目)、AFTER 変数 (identifier-5 が参照するデータ項目および index-name-3)、または FROM 変数 (identifier-3 が参照するデータ項目および index-name-2) への変更が考慮され、後続の PERFORM 文の実行に影響を与える。
2 つの一意名が参照するデータ項目を変更する場合、identifier-2 が参照するデータ項目の内容を変更するたびに、identifier-5 が参照するデータ項目は変更の全サイクル (FROM、BY、UNTIL) を経由する。3 つ以上の一意名が参照するデータ項目の内容を変更する場合も、変更のメカニズムは 2 つの場合と同じである。ただし、各 AFTER 指定が変更するデータ項目は、先行する AFTER 指定が変更するデータ項目が増分されるたびに、変更の全サイクルを経由する。