根据我在使用UNSTRING
时的理解,如果在使用UNSTRING
时会出现溢出,使用ON OVERFLOW [INSTRUCTION]
将很有用。
但是如果没有溢出,为什么要使用NOT ON OVERFLOW [INSTRUCTION]
?
NOT ON OVERFLOW [INSTRUCTION]
唯一可能的效用是如果没有溢出,则传递指令,但是如果您已经从UNSTRING
中获得了预期的结果,那将有什么用呢?
是否有任何具体的例子说明这在本例中如何有用:
IDENTIFICATION DIVISION.
PROGRAM-ID. YOUR-PROGRAM-NAME.
DATA DIVISION.
FILE SECTION.
WORKING-STORAGE SECTION.
01 WS-VAR1 PIC A(11) VALUE "Hello World".
01 WS-VAR2 PIC A(5).
01 WS-VAR3 PIC A(5).
01 WS-COMPTEUR PIC 9 VALUE 2.
PROCEDURE DIVISION.
MAIN-PROCEDURE.
INTO WS-VAR2 WS-VAR3
WITH POINTER WS-COMPTEUR
ON OVERFLOW DISPLAY "This string is too large"
END-UNSTRING.
DISPLAY WS-VAR2
DISPLAY WS-VAR3.
STOP RUN.
END PROGRAM YOUR-PROGRAM-NAME.
即使我阅读了 IBM 文档,它也没有给我太多关于在这种情况下可以使用什么的解释,但显示一条消息?
IBM 文档 : 链接
根据我对使用 UNSTRING 时的理解,使用 ON OVERFLOW 短语将很有用,如果在使用中会出现溢出 的取消字符串。
但是如果没有溢出,你为什么要使用 NOT ON OVERFLOW 短语?
唯一可能的实用程序 不 在溢出 短语是 如果没有溢出,则传递指令,但会是什么 如果您已经从 解串 ?
在 COBOL 74 中没有NOT ON OVERFLOW
短语。因此,有必要使用GO TO
语句或在紧随其后的IF
语句中设置测试标志。COBOL 85 中添加了NOT ON OVERFLOW
短语和END-UNSTRING
,以改进程序结构。
对于您的示例,我进行了一些更改,首先显示WS-VAR1
然后显示UNSTRING
的结果。请注意,OVERFLOW
条件涉及项目数,而不是文本的长度。我运行了三个测试来显示结果
IDENTIFICATION DIVISION.
PROGRAM-ID. YOUR-PROGRAM-NAME.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-VAR1 PIC A(11) VALUE "Hello World".
01 WS-VAR2 PIC A(5).
01 WS-VAR3 PIC A(5).
PROCEDURE DIVISION.
MAIN-PROCEDURE.
MOVE SPACE TO WS-VAR2 WS-VAR3
DISPLAY WS-VAR1
UNSTRING WS-VAR1
DELIMITED SPACE
INTO WS-VAR2 WS-VAR3
ON OVERFLOW
DISPLAY
"Incorrect number of items in WS-VAR1 - expected 2"
NOT ON OVERFLOW
DISPLAY WS-VAR2
DISPLAY WS-VAR3
END-UNSTRING
STOP RUN.
END PROGRAM YOUR-PROGRAM-NAME.
结果:
Hello World
Hello
World
--
Hello
Incorrect number of items in WS-VAR1 - expected 2
--
Hello W rld
Incorrect number of items in WS-VAR1 - expected 2
从代码中可以看出,ON OVERFLOW
用于错误处理;NOT ON OVERFLOW
用于正常处理。如果没有NOT ON OVERFLOW
改进的结构,正常的处理将立即跟随错误处理,除非使用前面提到的COBOL 74类型的处理。
请注意,DELIMITED ALL SPACE
给出的结果与上述一种情况显示的结果不同。[忽略--
]
--
Hello
Hello
--
如果需要调用 PROCEDURE 来验证此句子(例如 SORT-COLORS(,则可以使用 "NOT ON OVERFLOW " 语句。
MOVE 0 TO COUNT-1.
UNSTRING COLOR-LIST
DELIMITED BY ":" OR "/" OR ALL SPACE
*DELIMIT-1 and COUNT-1 will hold only
*the values associated with COLOR-1.
INTO COLOR-1
DELIMITER IN DELIMIT-1
COUNT IN COUNT-1,
COLOR-2,
COLOR-3,
COLOR-4
ON OVERFLOW
DISPLAY "overflow: unstring colors"
NOT ON OVERFLOW
*do when UNSTRING succeeds.
PERFORM **SORT-COLORS**
END-UNSTRING.
*COLOR-1 = "RED "
*COLOR-2 = "BLUE "
*COLOR-3 = "GREEN "
*COLOR-4 = "YELLOW"
*DELIMIT-1 = ": "
*COUNT-1 = 3 count-1 holds the number of characters in RED
您可以在此链接上查看更多示例 https://supportline.microfocus.com/documentation/acucorpproducts/docs/v6_online_doc/gtman3/gt36141.htm
在实践中,如果您需要发现您的命令(unsting(是否成功执行,并且没有IF,您可以使用此语句来定义它。
使用应用程序的示例
IDENTIFICATION DIVISION.
PROGRAM-ID. YOUR-PROGRAM-NAME.
DATA DIVISION.
FILE SECTION.
WORKING-STORAGE SECTION.
01 WS-VAR1 PIC A(11) VALUE "Hello World".
01 WS-VAR2 PIC A(5).
01 WS-VAR3 PIC A(5).
01 WS-COMPTEUR PIC 9 VALUE 2.
PROCEDURE DIVISION.
MAIN-PROCEDURE.
INTO WS-VAR2 WS-VAR3
WITH POINTER WS-COMPTEUR
ON OVERFLOW
PERFORM RT-SEND-ERROR-MAIL
NOT ON OVERFLOW
PERFORM RT-SEND-SUCESS-MAIL
END-UNSTRING.
DISPLAY WS-VAR2
DISPLAY WS-VAR3.
STOP RUN.
END PROGRAM YOUR-PROGRAM-NAME.