退出双重表演

Exit a double perform

是否可以退出双人表演:

                PERFORM VARYING J FROM 1 BY 1 UNTIL J>10
                    PERFORM VARYING K FROM 1 BY 1 UNTIL K>3
                      IF J=2 and K=2
                         EXIT PERFORM
                      ELSE
                         display "LABEL A ===> PROCEDURE NOM_PROC2 "
                                 "J=/"J"/ AND K=/"K"/"
                      END-IF
                    END-PERFORM
                 END-PERFORM

我尝试使用 EXITI PERFORM,但它对我不起作用。

如果我对你的问题的理解正确,你想退出 both 内联 PERFORMsEXIT PERFORM。以下技术应该有效。

01  SWITCHES.
    05  EOL-SW  PIC X VALUE 'N'.
        88  EOL       VALUE 'Y'.
        88  NOT-EOL   VALUE 'N'.

SET NOT-EOL TO TRUE
PERFORM VARYING J FROM 1 BY 1 UNTIL J>10 OR EOL
    PERFORM VARYING K FROM 1 BY 1 UNTIL K>3 OR EOL
        IF J=2 and K=2
            SET EOL TO TRUE
        ELSE
            display "LABEL A ===> PROCEDURE NOM_PROC2 "
                  "J=/"J"/ AND K=/"K"/"
        END-IF
    END-PERFORM
END-PERFORM

在上一个问题中,您表示您正在将 PL/I 音译为 COBOL。与口语和书面语言一样,计算机语言也有翻译不好的习语和口语。

我认为,从逻辑上讲,这是等价的。

PERFORM VARYING J FROM 1 BY 1 UNTIL J>2
    PERFORM VARYING K FROM 1 BY 1 UNTIL K>2
        display "LABEL A ===> PROCEDURE NOM_PROC2 "
            "J=/"J"/ AND K=/"K"/"
    END-PERFORM
END-PERFORM

使用执行后变化的力量

   perform varying j from 1 by 1 until j > 10
       after k from 1 by 1 until k > 3
           if j = 2 and k = 2 then
               exit perform
           else
               display "j: " j ", k: " k
           end-if
   end-perform

prompt$ cobc -xj exitnest.cob
j: 01, k: 01
j: 01, k: 02
j: 01, k: 03
j: 02, k: 01
prompt$

COBOL 2014(草案)规范有 14.9.27.2

10) At least six AFTER phrases shall be permitted in varying-phrase.

好吧,如果你的原始代码是 PL/I 并且你的职责是在可以避免的情况下不改变程序的结构,那么使用 GO TO.

PL/I 可以使用 STOPRETURN(这两种都不适合您的情况)、LEAVEGOTO.

LEAVE label

GOTO label

您可以将其中任何一个更改为

GO TO label

并且有相同的结果。您甚至不需要更改现有标签,除了语法上的微小差异,甚至不必考虑标签后的任何代码。

如果您能够更改代码的结构,那么您已经有了两个很好的答案。 Brian Tiffin 的是最简洁的,但 cschneid 对大多数 COBOL 程序员来说更明显,他们不知道如何 "vary" 在同一个 PERFORM.

上多次 "vary"

怎么样:

DisplayLabel section.
           PERFORM VARYING J FROM 1 BY 1 UNTIL J>10
                PERFORM VARYING K FROM 1 BY 1 UNTIL K>3
                  IF J=2 and K=2
                     EXIT SECTION
                  ELSE
                     display "LABEL A ===> PROCEDURE NOM_PROC2 "
                             "J=/"J"/ AND K=/"K"/"
                  END-IF
                END-PERFORM
             END-PERFORM
exit section.

使用 "perform DisplayLabel"

调用 DisplayLabel 部分