05 nicely-named-data PIC X.
88 a-meangingful-condition VALUE "A".
88 another-meaingingful-condition
VALUE "A" "B"
"X" THRU "Z"
SPACE ZERO.
IF a-meaningful-condition
IF another-meaningful-condition
SET a-meaningful-condition TO TRUE
SET another-meaningful-condition
TO TRUE
IF 测试与 88(条件名称)关联的数据名称(条件变量)引用的值,以获取单个值或多个值之一,其中可以包括范围 (THRU) 和图形常量(零、空间、低值等)。
SET 是 1985 年标准中对 COBOL 的最新补充,将更改数据名称的值 to the 88 上指定的第一个值,这样如果您立即在测试中引用 88,则测试将为 true。
COBOL 没有布尔值,即解析为 0 或 1 或任何其他值(假/真)的意思。
任何支持对象的语言都可以用来模仿这种行为。也许你甚至已经在没有真正意识到的情况下做到了这一点。
正如 NealB 在评论中指出的那样,可以使用函数(或过程,或将控制权转移到另一个模块),但数据和对其的引用不会放在一起并免受意外损害。
COBOL 在定义数据结构方面具有很大的灵活性。 88 级对于维护和理解程序以及编写程序来说是一个强大的帮助。
我不知道还有哪种语言具有与此相同的直接和自然元素,但是有很多语言我不知道。
NealB 在有关使用 THRU/THROUGH 指定值范围的注释中再次提出了一个重要观点。
确实需要小心。尽管作者可能认为他们想要选择的数据可以用范围“010”THRU“090”表示,但他们可能没有意识到编译器所做的是包括每一个可能的值在该范围内,通过生成大于或等于“010”且小于或等于“090”的代码。
如果使用 THRU,请确保您的数据不能包含任何超出预期范围的内容。如果您的意思是“010”“020”“030”...“090”,只要数据在其入口点进行验证,就可以了,这样它就永远不会包含任何中间值。
典型的例子是大型机上的“A”到“Z”。我们都知道作者的意思,但编译器按字面意思理解。你cannot单独使用“A”THRU“Z”进行验证,因为在 EBCDIC 中,三组字母之间存在“间隙”,并且使用“A”THRU“Z”会将这些间隙视为正确的 88 使用。
某些 COBOL 编译器中的 88 级别确实下降的地方是缺少“FALSE”。
要重新使用上面的示例:
88 a-meaingingful-condition VALUE "A".
88 a-meaingingful-condition-NOT
VALUE "N".
要测试开关/标志,您可以使用第一个 88。要关闭 flag.switch,您必须使用第二个。不理想。请参阅下面的链接之一,了解 88 定义中的 FALSE 示例。
在过去,标志/开关是用 MOVE 语句设置和重置的。一旦涉及到 MOVE,您就会遇到与尝试使用函数相同的问题。 MOVE和88级VALUE之间没有绑定关系。
如今,SET 可用于更改字段的值、打开或关闭标志/开关。
05 FILLER PIC X.
88 a-meaingingful-condition
VALUE "A".
88 a-meaingingful-condition-NOT
VALUE "N".
正在测试的字段甚至不需要名称(可以是 FILLER 或省略(隐含的 FILLER))。
当然,正如 NealB 在对下面其中一个链接的评论中指出的那样,有人仍然可以使用组项目上的引用修改来通过 MOVE 进入该字段。所以...
01 FILLER.
05 FILLER PIC X.
88 a-meaingingful-condition
VALUE "A".
88 a-meaingingful-condition-NOT
VALUE "N".
现在他们甚至不能使用引用修改,因为没有可命名的字段。该字段的值只能来自定义中的 VALUE 子句,或者来自将 88 之一设置为 TRUE 的 SET 语句。
在此阶段,标志/开关具有的值(其实际值)变得无关紧要。
01 FILLER.
05 FILLER PIC X(7).
88 a-meaingingful-condition
VALUE "APPLE".
88 a-meaingingful-condition-NOT
VALUE "BICYCLE".
因为没有任何东西可以用来测试文字/数据名称,并且该字段不能是除 SET 之外的任何动词的目标,所以您不再需要检查所有包含 N、Y、0 或1,这样做,它们的情况并没有错误,并且没有其他值被放置在这些字段中。
我并不是建议使用 APPLE 和 BICYCLE,只是用它们来说明这一点。
88 也可以有一个以十六进制表示法表示的值,就像任何字母数字字段一样:
88 a-meaingingful-condition VALUE X"25".
还可以在组项上指定 88,通常使用图形常数作为值:
01 a-group-item.
88 no-more-data-for-matching VALUE HIGH-VALUES.
05 major-key PIC X(10).
05 minor-key PIC X(5).
在文件匹配过程中,可以在文件末尾将密钥设置为高值,并且使用这些密钥仍然会导致其他文件被正确处理(低于该文件的密钥) 。
以下是一些来自 SO 的问题的链接,这些问题与 88 级的重要方面直接相关或无关。
COBOL 88 级数据类型 https://stackoverflow.com/questions/12224233/cobol-level-88-data-type
cobol 中的组变量 https://stackoverflow.com/questions/6937189/group-variable-in-cobol
在 Cobol 中,为了测试“空或空”,我们使用“NOT = SPACE [ AND/OR ] LOW-VALUE”?是哪一个? https://stackoverflow.com/questions/4095131/in-cobol-to-test-null-or-empty-we-use-not-space-and-or-low-value-wh
前缀“NO”在 COBOL 变量中是否有特殊含义? https://stackoverflow.com/questions/18721739/does-a-prefix-of-no-have-any-special-meaning-in-a-cobol-variable
COBOL 大写字母数据验证? https://stackoverflow.com/questions/9012975/cobol-data-validation-for-capital-letter