基本 PERFORM ステートメント

基本 PERFORM ステートメント内で参照されるプロシージャー (単数または複数) が 1 回実行されると、 制御は PERFORM ステートメントの後続の次の実行可能ステートメントに渡されます。

注意PERFORM文はそれ自身を実行させてはならない。 これは、予期しない結果を引き起こす可能性がある再帰的 PERFORM を構成します。 したがって、再帰的 PERFORM ステートメントを指定してはなりません。

行内 PERFORM ステートメントは、行外 PERFORM ステートメントと同じ一般規 則に従って機能しますが、行内 PERFORM ステートメントでは行内 PERFORM に 含まれるステートメントが、プロシージャー名-1 (プロシージャー名-2 が指定され ている場合は、プロシージャー名-1 からプロシージャー名-2) の範囲内にあるステ ートメントの代わりに実行されるところだけが異なります。 行内 または行外 という語が特に明示されていない限り、 行外 PERFORM ステートメントに適用される規則はすべて、行内 PERFORM ステートメントにも適用されます。

行外 PERFORM ステートメントが実行される度に、プロシージャー名-1 という名 前を持つプロシージャーの最初のステートメントに制御が移されます。 そして必ず PERFORM ステートメントの次にあるステートメントに制御は戻されます。 制御がどの地点で戻されるかは、次のようにして決定されます。

  • プロシージャー名-1 が段落名であり、プロシージャー名-2 が指定されていない場合、プロシージャー名-1 の段落の最後のステートメントの実行後に制御の戻りが行われます。
  • プロシージャー名-1 がセクション名であり、プロシージャー名-2 が指定されていない場合、プロシージャー名-1 のセクションにある最後の段落の最後のステートメントの実行後に制御の戻りが行われます。
  • プロシージャー名-2 指定されており、それが段落名である場合、プロシージャー名-2 の段落の最後のステートメントの実行後に制御の戻りが行われます。
  • プロシージャー名-2 が指定されており、それがセクション名である場合、プロシージャー名-2 のセクションにある最後の段落の最後のステートメントの実行後に制御の戻りが行われます。

プロシージャー名-1プロシージャー名-2 との間で保持しなければならない唯一の関係は、連続する一連の処理が、プロシージャー名-1 によって指名されるプロシージャーから始まり、プロシージャー名-2 によって指名されるプロシージャーの実行によって終了するということだけです。

PERFORM ステートメントを、実行されるプロシージャーの中で指定することがで きます。 戻る地点への論理パスが 2 つ以上ある場合、 EXIT ステートメントだけからなる段落の名前をプロシージャー名-2 として指定することができます。 その場合、戻り点へのすべてのパスは、この段落に導かれます。

実行されるプロシージャー中に別の PERFORM ステートメントが含まれているとき、 組み込まれた PERFORM ステートメントに関連する一連のプロシージャーは、 最初の PERFORM ステートメントにより実行されるプロシージャーの中に完全に含まれているか、 または完全に外側になければなりません。 すなわち、実行開始点が、 別のアクティブな PERFORM ステートメントにより実行されるプロシージャーの範囲内にある PERFORM ステートメントは、 別のアクティブな PERFORM ステートメントの出口点を通りすぎて制御を渡すことはできません。 ただし、2 つ以上のアクティブな PERFORM ステートメントには、共通出口を持たせることができます。

PERFORM ステートメント以外の手段によって一連のプロシージャーに制御が渡さ れる場合、それらのプロシージャーを参照する PERFORM ステートメントが何もな いかのように、制御は出口点を通りすぎて次の実行可能ステートメントに渡されま す。

以下の図は、PERFORM ステートメントの有効な実行シーケンスを示しています。

例 1
これは、最初の実行を示す example1 です。
例1の出力は次のようになる:
OUTPUT:
Start PERFORM example1 
a                      
d                      
f                      
j                      
f                      
j                      
m                      
End   PERFORM example1 
例 2
これは、2 番目の実行を示す例 2 です。
例2の出力は次のようになる:

OUTPUT:
Start PERFORM example2 
a                      
d                      
f                      
j                      
h                      
m
End   PERFORM example2
例 3
これは、3 番目の実行を示す例 3 です。
例3の出力は次のようになる:

OUTPUT:
Start PERFORM example3 
a                      
f                      
m
End   PERFORM example3 
例 4
これは、4 番目の実行を示す例 4 です。
例4の出力は次のようになる:

OUTPUT:
Start PERFORM example4 
a                      
d
j  
m
f
j
m
End   PERFORM example4