 
 
 
 The PERFORM statement is used to control execution of one or more imperative statements which are in the scope of that PERFORM statement.
 The PERFORM statement is used to control execution of one or more imperative statements which are in the scope of that PERFORM statement. 
    

 The PERFORM statement is used to process each element of an array.
 The PERFORM statement is used to process each element of an array. 
    
See also the section The EXIT Statement.
 If procedure-name-1 is omitted, imperative-statement-1 and the END-PERFORM phrase must be specified; if procedure-name-1 is specified, imperative-statement-1 and the END-PERFORM phrase must not be specified.
 If procedure-name-1 is omitted, imperative-statement-1 and the END-PERFORM phrase must be specified; if procedure-name-1 is specified, imperative-statement-1 and the END-PERFORM phrase must not be specified. 
       When imperative-statement-1 is specified, the END-PERFORM phrase is optional.
 When imperative-statement-1 is specified, the END-PERFORM phrase is optional. 
      
 Procedure-name-1 and imperative-statement-1 may both be omitted.
 Procedure-name-1 and imperative-statement-1 may both be omitted. 
      


 Floating-point data items and literals can be used anywhere a numeric data item or literal can be specified. They cannot be used where an integer is required.
 Floating-point data items and literals can be used anywhere a numeric data item or literal can be specified. They cannot be used where an integer is required. 
     In Format 4, if procedure-name-1 is omitted, the AFTER phrase must not be specified.
 In Format 4, if procedure-name-1 is omitted, the AFTER phrase must not be specified. 
      
 This restriction does not apply.
 This restriction does not apply. 
      
 Six AFTER phrases are permitted in Format 4 of the PERFORM statement.
 Six AFTER phrases are permitted in Format 4 of the PERFORM statement. 
      
 This limit is raised to fifteen.
 This limit is raised to fifteen. 
      

 
 
 Identifier-9 must be an instance of a collection class, i.e. a class that has a GetEnumerator method returning a type that: 
      
Any class that implements the System.Collections.IEnumerable interface satisfies the above rules and is therefore a collection class. All .NET arrays are such collection classes, as are the various Dictionary and List classes defined in the .NET framework.
 Identifier-9 must be an instance of a collection class, i.e. a class that has a GetEnumerator method returning a type that: 
      
Any class that implements the System.Collections.IEnumerable interface satisfies the above rules and is therefore a collection class. All .NET arrays are such collection classes, as are the various Dictionary and List classes defined in the .NET framework. 
    
 It must be possible to perform a casting operation from the element type of identifier-9 to the type of identifier-8.
 It must be possible to perform a casting operation from the element type of identifier-9 to the type of identifier-8. 
     
         when procedure-name-1 is omitted, the PERFORM statement is referred to as an in-line PERFORM statement.
  
             
           when procedure-name-1 is omitted, the PERFORM statement is referred to as an in-line PERFORM statement. 
         
      
 
         or contained in the PERFORM statement itself for an in-line PERFORM statement
 or contained in the PERFORM statement itself for an in-line PERFORM statement 
         
      
are referred to as the specified set of statements.
 The END-PERFORM phrase delimits the scope of the in-line PERFORM statement. (See the topic 
      Explicit and Implicit Scope Terminators in the chapter 
      Concepts of the COBOL Language.)
 The END-PERFORM phrase delimits the scope of the in-line PERFORM statement. (See the topic 
      Explicit and Implicit Scope Terminators in the chapter 
      Concepts of the COBOL Language.) 
     An in-line PERFORM statement functions according to the following general rules for an otherwise identical out-of-line PERFORM statement, with the exception that the statements contained within the in-line PERFORM statement are executed in place of the statements contained within the range of procedure-name-1 (through procedure-name-2 if specified). Unless specifically qualified by the word in-line or out-of-line, all the general rules which apply to the out-of-line PERFORM statement also apply to the in-line PERFORM statement.
 An in-line PERFORM statement functions according to the following general rules for an otherwise identical out-of-line PERFORM statement, with the exception that the statements contained within the in-line PERFORM statement are executed in place of the statements contained within the range of procedure-name-1 (through procedure-name-2 if specified). Unless specifically qualified by the word in-line or out-of-line, all the general rules which apply to the out-of-line PERFORM statement also apply to the in-line PERFORM statement. 
     If an in-line PERFORM statement is specified, an execution of the PERFORM statement is completed after the last statement contained within it has been executed.
 If an in-line PERFORM statement is specified, an execution of the PERFORM statement is completed after the last statement contained within it has been executed. 
         An EXIT PERFORM statement can be used to exit an in-line perform before executing all statements within the in-line perform.
  An EXIT PERFORM statement can be used to exit an in-line perform before executing all statements within the in-line perform. 
        During execution of the PERFORM statement, reference to identifier-1 cannot alter the number of times the specified set of statements is to be executed from that which was indicated by the initial value of the data item referenced by identifier-1.
Integer-1 must be zero or positive, but it may be signed.
 
             and the TEST BEFORE phrase is specified or implied,
 and the TEST BEFORE phrase is specified or implied, 
             
          
no transfer to procedure-name-1 takes place, and control is passed to the end of the PERFORM statement.
 If the TEST AFTER phrase is specified, the PERFORM statement functions as if the TEST BEFORE phrase were specified except that the condition is tested after the specified set of statements has been executed. Any subscripting or reference modification associated with the operands specified in condition-1 is evaluated each time the condition is tested.
 If the TEST AFTER phrase is specified, the PERFORM statement functions as if the TEST BEFORE phrase were specified except that the condition is tested after the specified set of statements has been executed. Any subscripting or reference modification associated with the operands specified in condition-1 is evaluated each time the condition is tested. 
          
 When UNTIL EXIT is specified, the specified set of statements is performed repeatedly until some statement in the set causes this repetition to end. In the case of an out-of-line PERFORM, the only statements that will cause this termination are statements such as EXIT PROGRAM and STOP RUN. In the case of an in-line PERFORM, the repetition can also be terminated by the EXIT PERFORM statement and the GO TO statement.
 When UNTIL EXIT is specified, the specified set of statements is performed repeatedly until some statement in the set causes this repetition to end. In the case of an out-of-line PERFORM, the only statements that will cause this termination are statements such as EXIT PROGRAM and STOP RUN. In the case of an in-line PERFORM, the repetition can also be terminated by the EXIT PERFORM statement and the GO TO statement. 
          
If index-name-1 is specified, the value of identifier-3, index-name- 2, or literal-1 at the beginning of the execution of the PERFORM statement must correspond to an occurrence number of an element in the table associated with index-name-1. If index-name-3 is specified, the value of identifier-6, index-name-4, or literal-3 at the beginning of the execution of the PERFORM statement must correspond to an occurrence number of an element in the table associated with index-name-3.
Subsequent augmentation, as described below, of index-name-1 or index-name-3 must not result in the associated index being set to a value outside the range of the table associated with index-name-1 or index-name-3; except that, at the completion of the PERFORM statement, the index associated with index-name-1 can contain a value that is outside the range of the associated table by one increment or decrement value.
If identifier-2 or identifier-5 is subscripted, the subscripts are evaluated each time the content of the data item referenced by the identifier is set or augmented. If identifier-3, identifier-4, identifier-6, or identifier-7 is subscripted, the subscripts are evaluated each time the content of the data item referenced by the identifier is used in a setting or augmenting operation. Any subscripting or reference modification associated with the operands specified in condition-1 or condition-2 is evaluated each time the condition is tested.
Representations of the actions of several types of Format 4 PERFORM statements are given on the following pages.
When the data item referenced by one identifier is varied, the content of the data item referenced by identifier-2 is set to literal-1 or the current value of the data item referenced by identifier-3 at the point of initial execution of the PERFORM statement; then, if the condition of the UNTIL phrase is false, the specified set of statements is executed once. The value of the data item referenced by identifier-2 is augmented by the specified increment or decrement value (literal-2 or the value of the data item referenced by identifier-4) and condition-1 is evaluated again. The cycle continues until this condition is true, at which point control is transferred to the end of the PERFORM statement. If condition-1 is true at the beginning of execution of the PERFORM statement, control is transferred to the end of the PERFORM statement. See the diagram below.
When the data items referenced by two identifiers are varied, the content of the data item referenced by identifier-2 is set to literal-1 or the current value of the data item referenced by identifier-3 and then the content of the data item referenced by identifier-5 is set to literal-3 or the current value of the data item referenced by identifier-6. See the diagram of The VARYING Option of a PERFORM Statement with the TEST BEFORE Phrase Having Two Conditions below.
After the contents of the data items referenced by the identifiers have been set, condition-1 is evaluated; if true, control is transferred to the end of the PERFORM statement; if false, condition-2 is evaluated. If condition-2 is false, the specified set of statements is executed once, then the content of the data item referenced by identifier-5 is augmented by literal-4 or the content of the data item referenced by identifier-7 and condition-2 is evaluated again.
This cycle of evaluation and augmentation continues until this condition is true. When condition-2 is true, the content of the data item referenced by identifier-2 is augmented by literal-2 or the content of the data item referenced by identifier-4, the content of the data item referenced by identifier-5 is set to literal-3 or the current value of the data item referenced by identifier-6, and condition-1 is reevaluated. The PERFORM statement is completed if condition-1 is true; if not, the cycle continues until condition-1 is true.
At the termination of the PERFORM statement, the data item referenced by identifier-5 contains literal-3 or the current value of the data item referenced by identifier-6. The data item referenced by identifier-2 contains a value that exceeds the last used setting by one increment or decrement value, unless condition-1 was true when the PERFORM statement was entered, in which case the data item referenced by identifier-2 contains literal-1 or the current value of the data item referenced by identifier-3.
 If the TEST AFTER phrase is specified:
 If the TEST AFTER phrase is specified: 
              When the data item referenced by one identifier is varied, the content of the data item referenced by identifier-2 is set to literal-1 or the current value of the data item referenced by identifier-3 at the point of execution of the PERFORM statement; then the specified set of statements is executed once and condition-1 of the UNTIL phrase is tested. If the condition is false, the value of the data item referenced by identifier-2 is augmented by the specified increment or decrement value (literal-2 or the value of the data item referenced by identifier-4) and the specified set of statements is executed again. The cycle continues until condition-1 is tested and found to be true, at which point control is transferred to the end of the PERFORM statement. See the diagram below.

When the data items referenced by two identifiers are varied, the content of the data item referenced by identifier-2 is set to literal-1 or the current value of the data item referenced by identifier-3; then the current value of the data item referenced by identifier-5 is set to literal-3 or the current value of the data item referenced by identifier-6; and the specified set of statements is then executed. Condition-2 is then evaluated; if false, the content of the data item referenced by identifier-5 is augmented by literal-4 or the content of the data item referenced by identifier-7 and the specified set of statements is again executed. The cycle continues until condition-2 is again evaluated and found to be true, at which time condition-1 is evaluated. If false, the content of the data item referenced by identifier-2 is augmented by literal-2 or the content of data item referenced by identifier-4, the content of the data item referenced by identifier-5 is set to literal-3 or the current value of the data item referenced by identifier-6 and the specified set of statements is again executed. This cycle continues until condition-1 is again evaluated and found to be true, at which time control is transferred to the end of the PERFORM statement. See the diagram The VARYING Option of a PERFORM Statement with a TEST AFTER Phrase Having Two Conditions below.
After completion of the PERFORM statement, each data item varied by an AFTER or VARYING phrase contains the same value it contained at the end of the most recent execution of the specified set of statements.
During the execution of the specified set of statements associated with the PERFORM statement, any change to the VARYING variable (the data item referenced by identifier-2 and index-name-1), the BY variable (the data item referenced by identifier-4), the AFTER variable (the data item referenced by identifier-5 and index-name-3), or the FROM variable (the data item referenced by identifier-3 and index-name-2) is taken into consideration and affects the operation of the PERFORM statement.
When the data items referenced by two identifiers are varied, the data item referenced by identifier-5 goes through a complete cycle (FROM, BY, UNTIL) each time the content of the data item referenced by identifier-2 is varied. When the contents of three or more data items referenced by identifiers are varied, the mechanism is the same as for two identifiers except that the data item being varied by each AFTER phrase goes through a complete cycle each time the data item being varied by the preceding AFTER phrase is augmented.

 Format 5 is the PERFORM VARYING ... THROUGH. This variation of the PERFORM statement is used to set the values referenced by identifier-8 to access every element of collection during the execution of a PERFORM statement. The specified set of statements is performed once for each element of the collection referenced by identifier-9. Following the execution of the specified set of statements for each element of the collection, control is transferred to the end of the PERFORM statement. During execution of the PERFORM statement, reference to identifier-8 or identifier-9 cannot alter the number of times the specified set of statements is to be executed from that which was indicated by the initial size of the collection referenced by identifier-9.
 Format 5 is the PERFORM VARYING ... THROUGH. This variation of the PERFORM statement is used to set the values referenced by identifier-8 to access every element of collection during the execution of a PERFORM statement. The specified set of statements is performed once for each element of the collection referenced by identifier-9. Following the execution of the specified set of statements for each element of the collection, control is transferred to the end of the PERFORM statement. During execution of the PERFORM statement, reference to identifier-8 or identifier-9 cannot alter the number of times the specified set of statements is to be executed from that which was indicated by the initial size of the collection referenced by identifier-9. 
         These restrictions are not enforced. PERFORM statements can be freely nested, and recursion (a PERFORM statement performing a procedure containing it) is allowed. Only the exit point of the innermost PERFORM statement currently being executed is recognized. These rules can be changed by use of the PERFORM-TYPE Compiler directive.
 These restrictions are not enforced. PERFORM statements can be freely nested, and recursion (a PERFORM statement performing a procedure containing it) is allowed. Only the exit point of the innermost PERFORM statement currently being executed is recognized. These rules can be changed by use of the PERFORM-TYPE Compiler directive. 
      
See the following illustrations for examples of legal PERFORM constructs.

 These restrictions do not apply.
 These restrictions do not apply. 
      

 These restrictions do not apply.
 These restrictions do not apply. 
      
 
 
