PERFORM 文

PERFORM 文は、1 つ以上の手続きに制御を明示的に移し、その手続きの実行が終了した時点で、暗黙的に制御を戻すために使用する。

ANS85 PERFORM 文は、その PERFORM 文の範囲内にある 1 つ以上の無条件文の実行を制御するために使用する。

NETJVM PERFORM 文は、配列の各要素を処理するために使用する。

EXIT 文」セクションも参照。

書き方 1 の一般形式 (外 PERFORM)

書き方 2 の一般形式 (内 PERFORM)

NETJVM 

書き方 3 の一般形式

指令

  1. 予約語リストのフラグ設定および修正を行うコンパイラ指令に加えて、以下の指令が、本セクションに記載の構文または意味内容に影響を与える可能性がある。
    • PERFORM-TYPE - 重複する PERFORM の範囲の処理を制御する。

すべての書き方の構文規則

  1. 各一意名は、データ部に記述した数値基本項目を表す。identifier-1 は整数として記述する。
  2. OSVSVSC2MF 浮動小数点数のデータ項目および定数は、数値データ項目または定数を指定できる任意の場所で使用できる。ただし、整数が要求される箇所には使用できない。
  3. TEST を指定する場合、EXIT は指定できない。
  4. ANS85 TEST BEFORE も TEST AFTER も指定しない場合は、TEST BEFORE を指定したと見なされる。
  5. condition-1、condition-2、...には、任意の条件式を指定できる。「手続き部」の章の「条件式」セクションを参照。
  6. 各定数は、数値定数を表わす。
  7. VARYING または AFTER で index-name を指定する場合は、以下のようにする。
    1. 関連付ける FROM 指定および BY 指定内の identifier は、整数データ項目を参照するものとする。
    2. 関連付ける FROM 指定内の literal は、正の整数とする。
    3. 関連付ける BY 指定内の literal は、ゼロ以外の整数とする。
  8. FROM 指定内で index-name を指定する場合は、以下のようにする。
    1. 関連付ける VARYING 指定または AFTER 指定内の identifier は、整数データ項目を参照するものとする。
    2. 関連付ける BY 指定内の identifier は、整数データ項目を参照するものとする。
    3. 関連付ける BY 指定の中の literal は、整数とする。
  9. BY 指定内の literal は、ゼロ以外の値とする。
  10. PERFORM 文では、AFTER 指定を 2 つ使用できる。

    ANS85 PERFORM 文では、AFTER 指定を 6 つ使用できる。

    MF この制限は、15 に拡張されている。

書き方 1 の構文規則

  1. 語 THROUGH および THRU は同等である。
  2. procedure-name-1 および procedure-name-2 を両方指定する際に、どちらかが手続き部の宣言部分に含まれる手続き名である場合、両方とも同じ宣言節に含めるものとする。
NETJVM 

書き方 3 の構文規則

  1. NETJVM identifier-9 は、マネージ配列またはコレクション クラスのインスタンスとする。コレクション クラスとは、System.IEnumerable インターフェイス (.NET) または java.lang.Iterable インターフェイス (JVM) を実装するクラスである。コレクション クラスの例としては、List クラスおよび Dictionary クラスがある。
  2. NETJVM identifier-9 の要素型から identifier-8 の型へのキャスト操作を実行できる必要がある。

書き方 1 の一般規則

  1. procedure-name-1 の範囲内 (指定されている場合は procedure-name-2 まで) に含まれる文は、指定された文の組と呼ばれる。
  2. PERFORM 文を実行すると、指定された文の組の最初の文に制御が移る (一般規則 8b、8c、8d、および 8e に該当する場合は除く)。この制御の移行は、PERFORM 文を実行するたびに 1 回だけ行われる。指定された文の組に制御が移ると、以下のとおり PERFORM 文の末尾に暗黙的に制御が移る。
    1. procedure-name-1 が段落名であり procedure-name-2 は指定されていない場合、procedure-name-1 の最後の文が実行されると、制御は PERFORM 文の末尾に戻る。
    2. procedure-name-1 が節名であり procedure-name-2 は指定されていない場合、procedure-name-1 の最後の段落の最後の文が実行されると、制御は PERFORM 文の末尾に戻る。
    3. procedure-name-2 が指定されており、それが段落名である場合、その段落の最後の文が実行されると、制御は PERFORM 文の末尾に戻る。
    4. procedure-name-2 が指定されており、それが節名である場合、その節内の最後の段落の最後の文が実行されると、制御は PERFORM 文の末尾に戻る。
  3. procedure-name-1 および procedure-name-2 の間に関連がある必要はない。ただし、procedure-name-1 という名前の手続きで開始して procedure-name-2 という名前の手続きで終了する、連続した一連の操作を実行する必要がある。特に、GO 文および PERFORM 文を、procedure-name-1 から procedure-name-2 の終わりまでに使用する場合がある。戻り点への論理パスが複数ある場合、procedure-name-2 には、これらのパスをすべて導く EXIT 文で構成される段落の名前を指定できる。
  4. ある PERFORM 文の範囲内に別の PERFORM 文が含まれる場合、含まれる方の PERFORM 文に関連付ける一連の手続きは、最初の PERFORM 文が参照する論理シーケンスに完全に含まれるか、完全にその外にあるかのどちらかとする。したがって、あるアクティブな PERFORM 文の範囲内で実行ポイントが開始するアクティブな PERFORM 文は、もう一方のアクティブな PERFORM 文の出口に制御を渡すべきではない。また、そのような複数のアクティブな PERFORM 文が出口を共有すべきではない。

    MF これらの制限は必須ではない。PERFORM 文を自由に入れ子にしたり、再帰 (PERFORM 文が、その PERFORM 文を含む手続きを実行すること) したりすることが可能である。現在実行されている、最も内側の PERFORM 文の出口だけが認識される。これらの規則は、PERFORM-TYPE コンパイラ指令を使用することで変更できる。

    PERFORM 文の正しい構成例を以下に示す。


    *

書き方 2 の一般規則

  1. ANS85 PERFORM 文自体に含まれる文は、指定された文の組と呼ばれる。
  2. ANS85 END-PERFORM 指定は、内 PERFORM 文の範囲を区切る。「COBOL 言語の概念」の章の「明示範囲符および暗示範囲符」トピックを参照。
  3. ANS85 内 PERFORM 文は、基本的には、同一の外 PERFORM 文用の以下の一般規則に従って機能する。ただし例外として、外 PERFORM 文では procedure-name-1 の範囲内 (指定されている場合は procedure-name-2 まで) に含まれる文が実行されるのに対し、内 PERFORM 文ではその PERFORM 文内に含まれる文が実行される。以降の記述では、特に「内」または「外」と明示しない限り、外 PERFORM 文に該当する一般規則はすべて内 PERFORM 文にも該当する。
  4. PERFORM 文を実行すると、指定された文の組の最初の文に制御が移る (一般規則 2b、2c、2d、および 2e に該当する場合は除く)。この制御の移行は、PERFORM 文を実行するたびに 1 回だけ行われる。指定された文の組に制御が移ると、以下のとおり PERFORM 文の末尾に暗黙的に制御が移る。
    1. MF EXIT PERFORM 文を使用すると、内 PERFORM 文内のすべての文の実行が終わる前に内 PERFORM 文を終了できる。

書き方 1 および 2 の一般規則

  1. 指定された文の組への制御の移行が PERFORM 文以外の手段で行われると、その文の組の最後の文から次の実行可能文に制御が移る。つまり、PERFORM 文がその文の組を参照しない場合と同様に処理される。
  2. PERFORM 文は以下のとおり機能する。
    1. 基本的な PERFORM 文では、この形式の PERFORM が参照する指定された文の組が 1 回実行された後に、この PERFORM 文の末尾に制御が戻る。
    2. PERFORM ...TIMES 形式を使用する場合は、指定された文の組が、integer-1 で指定した回数、または identifier-1 が参照するデータ項目の初期値で指定した回数だけ実行される。PERFORM 文の実行時に、identifier-1 が参照するデータ項目の値がゼロまたは負である場合は、制御は PERFORM 文の末尾に移る。指定された文の組が指定された回数実行された後、制御は PERFORM 文の末尾に移る。

      PERFORM 文の実行中、identifier-1 への参照は、指定された文の組の実行回数を、identifier-1 が参照するデータ項目の初期値が示す回数から変更できない。

      integer-1 はゼロまたは正の整数とし、符号付きでもよい。

    3. PERFORM ...UNTIL 形式を使用する場合は、指定された文の組が、UNTIL 指定で指定した条件が真になるまで繰り返し実行される。条件が真になると、PERFORM 文の末尾に制御が移る。PERFORM 文に入った時点で条件が真である場合、

      ANS85 および TEST BEFORE が指定、または暗黙指定されている場合、

      制御は procedure-name-1 に移らず、PERFORM 文の末尾に移る。

      ANS85 TEST AFTER を指定した場合、PERFORM 文は TEST BEFORE を指定した場合と同様に機能する。ただし、終了条件が検証されるのは、指定された文の組の実行後になる。condition-1 で指定した作用対象に関連付けた添え字付けまたは部分参照は、条件を検証するたびに評価される。

      MF UNTIL EXIT を指定すると、指定された文の組は、その中の何らかの文によって終了させられるまで、繰り返し実行される。外 PERFORM 文の場合、この繰り返しを終了する文は、EXIT PROGRAM および STOP RUN のみである。内 PERFORM 文の場合、EXIT PERFORM 文および GO TO 文を使用して、この繰り返しを終了できる。

    4. PERFORM ...VARYING 形式を使用する場合は、PERFORM 文の実行中に、1 つ以上の identifier または index-name が参照する値を規則的な方法で増やすことができる。以下の説明について、VARYING、AFTER、および FROM (現在の値) 指定の作用対象としての一意名に関する記述は、指標名にも該当する。

      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 文の処理について例示する。

      1. TEST BEFORE を明示的または暗黙的に指定した場合

        単一の一意名が参照するデータ項目を変更する場合、PERFORM 文の初回実行時に、identifier-2 が参照するデータ項目の内容が、literal-1 に設定されるか、identifier-3 が参照するデータ項目の現在の値に設定される。その後、UNTIL 指定の condition-1 が偽になると、指定された文の組が 1 回実行される。次に、identifier-2 が参照するデータ項目の値が、指定された値 (literal-2 の値、または identifier-4 が参照するデータ項目の値) だけ増分または減分され、condition-1 が再度評価される。このサイクルは、この条件が真になるまで継続する。条件が真になった時点で、PERFORM 文の末尾に制御が移る。PERFORM 文の実行開始時に condition-1 が真である場合、制御は PERFORM 文の末尾に移る。詳細については、下図を参照。


        TEST BEFORE 指定が 1 つの条件を持つ PERFORM 文の VARYING オプション

        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 が参照するデータ項目の現在の値が含まれる。

        図 1.TEST BEFORE 指定が 2 つの条件を持つ PERFORM 文の VARYING オプション
        TEST BEFORE 指定が 2 つの条件を持つ PERFORM 文の VARYING オプション
      2. ANS85 TEST AFTER を指定した場合

        単一の一意名が参照するデータ項目を変更する場合、PERFORM 文の実行開始時に、identifier-2 が参照するデータ項目の内容が、literal-1 に設定されるか、identifier-3 が参照するデータ項目の現在の値に設定された後、指定された文の組が 1 回実行される。次に、UNTIL 指定の condition-1 が検証される。この結果が偽の場合、identifier-2 が参照するデータ項目の値は、指定された値 (literal-2、または identifier-4 が参照するデータ項目の値) だけ増分または減分され、指定された文の組が再度実行される。このサイクルは、condition-1 の検証結果が真になるまで継続する。結果が真になると、PERFORM 文の末尾に制御が移る。詳細については、下図を参照。


        TEST AFTER 指定が 1 つの条件を持つ PERFORM 文の VARYING オプション

        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 文の末尾に制御が移る。以下の「2 つの条件を持つ TEST AFTER を指定した PERFORM 文の VARYING オプション」の図を参照。

        PERFORM 文の実行が完了すると、AFTER 指定または VARYING 指定が変更した各データ項目には、指定された文の組を最後に実行した時点と同じ値が含まれる。

        図 2.2 つの条件を持つ TEST AFTER を指定した PERFORM 文の VARYING オプション
        2 つの条件を持つ TEST AFTER を指定した PERFORM 文の 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 指定が変更するデータ項目が増分されるたびに、変更の全サイクルを経由する。

  3. PERFORM 文の範囲は、論理的には、PERFORM を実行してから PERFORM 文の末尾に明示的に制御が移るまでの結果として実行されるすべての文におよぶ。この範囲には、PERFORM 文の範囲内の CALL、EXIT、GO TO、および PERFORM 文が制御を移した結果として実行されるすべての文、および PERFORM 文の範囲内の文の実行結果として実行される宣言手続き内のすべての文が含まれる。PERFORM 文の範囲内の文は、ソース要素内で連続して記述する必要はない。
  4. 以下の両方の条件が該当する場合、EXIT PROGRAM 文の実行によって制御が移った結果実行される文は、PERFORM 文の範囲内にあるとは見なされない。
    1. EXIT PROGRAM 文が、PERFORM 文と同じプログラム中に指定されている。
    2. EXIT PROGRAM 文が、PERFORM 文の範囲内にある。
  5. identifier-4 および identifier-7 が参照するデータ項目は、ゼロ以外の値を持つものとする。
  6. VARYING 指定または AFTER 指定で index-name を使用し、関連付けた FROM 指定で identifier を使用する場合、この identifier が参照するデータ項目は、正の値を持つものとする。