COBOL2002 ユーザーズガイド

[目次][用語][索引][前へ][次へ]

5.6.2 PERFORM文

PERFORM(実行)文は,幾つかの手続きに明示的に制御を移し,指定した手続きの実行が終わると,暗黙的に制御を戻します。また,PERFORM文は,そのPERFORM文の範囲に含まれる一つ以上の文の実行を制御するためにも使用されます。

PERFORM文については,マニュアル「COBOL2002 言語 標準仕様編 10.8.31 PERFORM文」を参照してください。

<この項の構成>
(1) 基本的なPERFORM文の実行例
(2) VARYING指定のあるPERFORM文の実行例
(3) PERFORM文の実行範囲

(1) 基本的なPERFORM文の実行例

(a) ある条件を満たすまで処理を繰り返す場合(PERFORM UNTIL条件)

処理の流れ
[図データ]

実行例
       PERFORM UNTIL フラグ = '1'     *>1.
         READ 入力ファイル
           AT END MOVE '1' TO フラグ  *>2.
         END-READ
         IF  フラグ = '0'
           COMPUTE A = A + 1          *>3.
         END-IF
       END-PERFORM.
  1. ファイル終了フラグが'1'になるまで(ファイル入力が終了するまで),1.〜3.の処理を繰り返します。
  2. 入力ファイルからレコードを入力します。ファイル終了条件が成立すると,ファイル終了フラグに'1'をセットします。
  3. ファイル終了条件が成立しない場合は,Aに1を加算します。
(b) 指定した回数だけ処理を繰り返す場合(PERFORM 回数 TIMES)

処理の流れ
[図データ]

実行例
       PERFORM 10 TIMES      *>1.
         COMPUTE I = I + 10  *>2.
         DISPLAY I           *>3.
       END-PERFORM.
  1. 2.と3.を10回繰り返します。
  2. Iに10を加算した結果をIに入れます。
  3. Iを出力します。
    Iが初期設定で0になっている場合,出力結果は,10から始まって10飛びの数です。
(c) 手続きを呼び出す場合(そとPERFORM

処理の流れ
[図データ]

実行例
       主処理.
           OPEN INPUT 入力ファイル
                OUTPUT 出力ファイル.
           PERFORM 入力処理.                   *>1.
           PERFORM UNTIL 終了フラグ = '1'      *>2.
             PERFORM 出力処理                  *>3.
             PERFORM 入力処理                  *>4.
           END-PERFORM.
           CLOSE 入力ファイル
                 出力ファイル.
           STOP RUN.
       入力処理.
           READ 入力ファイル 
                AT END MOVE '1' TO 終了フラグ  *>5.
           END-READ.
       出力処理.
           MOVE 入力レコード TO 出力レコード.  *>6.
           WRITE 出力レコード.
        
  1. 入力処理を呼び出します。
  2. うちPERFORMで3.,4.をファイル終了条件が成立するまで繰り返します。
  3. 出力処理を呼び出します。
  4. 入力処理を呼び出します。
  5. 入力処理を実行します。
  6. 出力処理を実行します。
(d) 条件を満たす前にPERFORM文を終了する場合

実行例
           PERFORM VARYING I FROM 1 BY 1 UNTIL I > 10
               :
             PERFORM VARYING J FROM 1 BY 1 UNTIL J > 10
               :
               IF A(J) = 0
                 EXIT PERFORM  …1.
               END-IF
             END-PERFORM  …2.
               :
           END-PERFORM.
1.のEXIT PERFORM文を実行すると,2.のEND-PERFORMの次の文に制御が移ります。

(2) VARYING指定のあるPERFORM文の実行例

(a) PERFORM文にTEST BEFORE指定があり,VARYING指定中の条件が一つの場合(一つの一意名を変化させる場合)

処理の流れ
[図データ]

形式
           PERFORM WITH TEST BEFORE VARYING
                   一意名2 FROM {一意名3|定数1}
                           BY   {一意名4|定数2}
                           UNTIL  条件1
             無条件文1
                 :
           END-PERFORM.
  1. 一意名2のデータ項目の内容を定数1,またはPERFORM文の開始時の一意名3のデータ項目の現在値に等しくします。
  2. 条件1を検査します。
    条件1を満たしていれば,制御はPERFORM文の終わりに移ります。
    条件1を満たしていなければ,3.に進みます。
  3. 指定された文の組(無条件文1)を1回実行します。
  4. 一意名2のデータ項目の値に,定数2または一意名4のデータ項目の増加分または減少分を加え,2.に戻ります。
(b) PERFORM文にTEST BEFORE指定があり,VARYING指定中の条件が二つの場合(二つの一意名のデータ項目を変化させる場合)

処理の流れ
[図データ]

形式
           PERFORM WITH TEST BEFORE VARYING
                   一意名2 FROM {一意名3|定数1}
                           BY   {一意名4|定数2}
                           UNTIL 条件1
             AFTER 一意名5 FROM {一意名6|定数3}
                           BY   {一意名7|定数4}
                           UNTIL  条件2
             無条件文1
                :
           END-PERFORM
  1. 一意名2のデータ項目の内容を,定数1または一意名3のデータ項目の現在値に等しくします。
  2. 一意名5のデータ項目の内容を,定数3または一意名6のデータ項目の現在値に等しくします。
  3. 条件1を検査します。
    条件1を満たしていれば,制御はPERFORM文の終わりに移ります。
    条件1を満たしていなければ,4.に進みます。
  4. 条件2を検査します。
    条件2を満たしていれば,一意名2のデータ項目の内容に定数2または一意名4のデータ項目の内容を加え,2.に戻ります。
    条件2を満たしていなければ,5.に進みます。
  5. 指定された文の組(無条件文1)を1回実行します。
  6. 一意名5のデータ項目の内容に定数4または一意名7のデータ項目の内容を加えて,4.に戻ります。
(c) PERFORM文にTEST AFTER指定があり,VARYING指定中の条件が一つの場合(一つの一意名を変化させる場合)

処理の流れ
[図データ]

形式
       PERFORM WITH TEST AFTER
               VARYING 一意名2
               FROM {一意名3|定数1}
               BY {一意名4|定数2}UNTIL 条件1
         無条件文1
             :
       END-PERFORM.
  1. 一意名2のデータ項目の内容を,定数1またはPERFORM文開始時の一意名3のデータ項目の現在値に等しくします。
  2. 指定された文の組(無条件文1)を1回実行します。
  3. 条件1を検査します。
    条件1を満たしていれば,制御はPERFORM文の終わりに移ります。
    条件1を満たしていなければ,4.に進みます。
  4. 一意名2のデータ項目の値に定数2または一意名4のデータ項目の値の増加分または減少分を加え,2.に戻ります。
(d) PERFORM文にTEST AFTER指定があり,VARYING指定中の条件が二つの場合(二つの一意名のデータ項目を変化させる場合)

処理の流れ
[図データ]

形式
       PERFORM WITH TEST AFTER
               VARYING 一意名2 FROM 一意名3
               BY 一意名4 UNTIL 条件1
               AFTER 一意名5 FROM 一意名6
               BY 一意名7 UNTIL 条件2
         無条件文1
             :
       END-PERFORM.
  1. 一意名2のデータ項目の内容を,定数1または一意名3のデータ項目の現在値に等しくします。
  2. 一意名5のデータ項目の内容を,定数3または一意名6のデータ項目の現在値に等しくします。
  3. 指定された文の組(無条件文1)を1回実行します。
  4. 条件2を検査します。
    条件2を満たしていれば,5.に進みます。
    条件2を満たしていなければ,一意名5のデータ項目の内容に定数4または一意名7のデータ項目の内容を加え,3.に戻ります。
  5. 条件1を検査します。
    条件1を満たしていれば,制御はPERFORM文の終わりに移ります。
    条件1を満たしていなければ,6.に進みます。
  6. 一意名2のデータ項目の内容に定数2または一意名4のデータ項目の内容を加えて2.に戻ります。

(3) PERFORM文の実行範囲

PERFORM文の実行範囲にほかのPERFORM文がある場合,含まれているPERFORM文の実行範囲は,初めのPERFORM文の論理的な実行範囲の内側に完全に含まれているか,または完全に外側である必要があります。PERFORM文の実行範囲内で始められたほかのPERFORM文の制御は,前者のPERFORM文の出口を通ることはできません。また,実行中の2個以上のPERFORM文は,共通の出口を持つこともできません。

PERFORM文の詳細については,マニュアル「COBOL2002 言語 標準仕様編 10.8.31 PERFORM文」を参照してください。

PERFORM文の実行範囲の例を次に示します。

(例1)
正しい例(完全に内側に含まれている)
[図データ]

(例2)
正しい例(完全に外側にある)
[図データ]

(例3)
正しい例(同時に実行されていない)
[図データ]

(例4)
誤った例(後者のPERFORM文の制御が,前者のPERFORM文の出口を通っている)
[図データ]

(例5)
正しい例(同時に実行されていない)
[図データ]