5.6.2 PERFORM文
PERFORM(実行)文は,幾つかの手続きに明示的に制御を移し,指定した手続きの実行が終わると,暗黙的に制御を戻します。また,PERFORM文は,そのPERFORM文の範囲に含まれる一つ以上の文の実行を制御するためにも使用されます。
PERFORM文については,マニュアル「COBOL2002 言語 標準仕様編」 「10.8.31 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.〜3.の処理を繰り返します。
-
入力ファイルからレコードを入力します。ファイル終了条件が成立すると,ファイル終了フラグに'1'をセットします。
-
ファイル終了条件が成立しない場合は,Aに1を加算します。
-
(b) 指定した回数だけ処理を繰り返す場合(PERFORM 回数 TIMES)
- 処理の流れ
- 実行例
PERFORM 10 TIMES *>1. COMPUTE I = I + 10 *>2. DISPLAY I *>3. END-PERFORM.
-
2.と3.を10回繰り返します。
-
Iに10を加算した結果をIに入れます。
-
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 出力レコード.
-
入力処理を呼び出します。
-
うちPERFORMで3.,4.をファイル終了条件が成立するまで繰り返します。
-
出力処理を呼び出します。
-
入力処理を呼び出します。
-
入力処理を実行します。
-
出力処理を実行します。
-
(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.
-
一意名2のデータ項目の内容を定数1,またはPERFORM文の開始時の一意名3のデータ項目の現在値に等しくします。
-
条件1を検査します。
条件1を満たしていれば,制御はPERFORM文の終わりに移ります。
条件1を満たしていなければ,3.に進みます。
-
指定された文の組(無条件文1)を1回実行します。
-
一意名2のデータ項目の値に,定数2または一意名4のデータ項目の増加分または減少分を加え,2.に戻ります。
-
PERFORM文の実行を開始するとき,すでに条件1が満たされていれば,制御はPERFORM文の終わりに移ります。
-
PERFORM文にTEST BEFORE指定もTEST AFTER指定も書かない場合は,TEST BEFORE指定を書いたものとみなされます。
(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
-
一意名2のデータ項目の内容を,定数1または一意名3のデータ項目の現在値に等しくします。
-
一意名5のデータ項目の内容を,定数3または一意名6のデータ項目の現在値に等しくします。
-
条件1を検査します。
条件1を満たしていれば,制御はPERFORM文の終わりに移ります。
条件1を満たしていなければ,4.に進みます。
-
条件2を検査します。
条件2を満たしていれば,一意名2のデータ項目の内容に定数2または一意名4のデータ項目の内容を加え,2.に戻ります。
条件2を満たしていなければ,5.に進みます。
-
指定された文の組(無条件文1)を1回実行します。
-
一意名5のデータ項目の内容に定数4または一意名7のデータ項目の内容を加えて,4.に戻ります。
-
PERFORM文の実行が終わったとき,一意名5のデータ項目には,定数3または一意名6のデータ項目の現在値が入っています。一意名2のデータ項目には,増加分や減少分によって最後に変更された値が入っています。
-
PERFORM文の実行を始めたときに条件1が満足されていると,一意名2のデータ項目には,定数1または一意名3のデータ項目の現在値が入っています。
-
PERFORM文にTEST BEFORE指定もTEST AFTER指定も書かない場合は,TEST BEFORE指定を書いたものとみなされます。
(c) PERFORM文にTEST AFTER指定があり,VARYING指定中の条件が一つの場合(一つの一意名を変化させる場合)
- 処理の流れ
- 形式
PERFORM WITH TEST AFTER VARYING 一意名2 FROM {一意名3|定数1} BY {一意名4|定数2}UNTIL 条件1 無条件文1 : END-PERFORM.
-
一意名2のデータ項目の内容を,定数1またはPERFORM文開始時の一意名3のデータ項目の現在値に等しくします。
-
指定された文の組(無条件文1)を1回実行します。
-
条件1を検査します。
条件1を満たしていれば,制御はPERFORM文の終わりに移ります。
条件1を満たしていなければ,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.
-
一意名2のデータ項目の内容を,定数1または一意名3のデータ項目の現在値に等しくします。
-
一意名5のデータ項目の内容を,定数3または一意名6のデータ項目の現在値に等しくします。
-
指定された文の組(無条件文1)を1回実行します。
-
条件2を検査します。
条件2を満たしていれば,5.に進みます。
条件2を満たしていなければ,一意名5のデータ項目の内容に定数4または一意名7のデータ項目の内容を加え,3.に戻ります。
-
条件1を検査します。
条件1を満たしていれば,制御はPERFORM文の終わりに移ります。
条件1を満たしていなければ,6.に進みます。
-
一意名2のデータ項目の内容に定数2または一意名4のデータ項目の内容を加えて2.に戻ります。
-
PERFORM文の実行が完全に終わったあと,AFTER指定またはVARYING指定によって変更される各データ項目には,指定された文の組が最後に実行されたときと同じ値が入っています。
-
PERFORM文の指定された文の組の実行中に,次の項目を変更した場合,その変更が評価されてPERFORM文の実行に影響を与えます。
-
VARYING指定の一意名2のデータ項目
-
BY指定の一意名4のデータ項目
-
AFTER指定の一意名5のデータ項目
-
FROM指定の一意名3のデータ項目
-
-
二つの一意名のデータ項目を変化させるとき,一意名5の繰り返し(FROM,BY,UNTIL)が完全に1回終わるたびに,一意名2のデータ項目の内容が変更されます。三つ以上の一意名のデータ項目を変化させるときの機構も,一意名が二つのときと同じで,AFTER指定のデータ項目の繰り返しが完全に終わるたびに,先行するAFTER指定のデータ項目が変更されます。
(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)
-
正しい例(同時に実行されていない)