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 的最新补充,将数据名称的值更改为 88 上指定的第一个值,因此如果您在测试中立即引用 88,则该测试为真。
COBOL 没有布尔值,即解析为 0 或 1 或其他任何东西,即为假/真。
任何支持对象的语言都可以用来模仿行为。也许您甚至已经在没有真正意识到的情况下完成了它。
正如 NealB 在 cmets 中指出的那样,可以使用函数(或过程,或将控制权转移到另一个模块),但数据和对它的引用不会在一起并且不会受到意外伤害。
COBOL 在定义数据结构方面具有很大的灵活性。 88 级是维护和理解程序以及首先编写程序的有力帮助。
我不知道另一种语言具有与此等价的直接和自然元素,但是还有很多我不知道的语言。
NealB 再次在 cmets 中提出了一个关于使用 THRU/THROUGH 指定值范围的重要观点。
确实需要小心。虽然作者可能认为他们想要选择的数据可以用范围“010”到“090”来表示,但他们可能没有意识到编译器所做的是包含每一个可能的值在该范围内,通过生成大于或等于“010”且小于或等于“090”的代码。
如果使用 THRU,请确保您的数据不能包含超出预期范围内的任何内容。如果您的意思是“010”“020”“030”...“090”,那很好,只要数据在其入口点得到验证,这样它就永远不会包含任何中间值。
经典示例是大型机上的“A”到“Z”。我们都知道作者的意思,但编译器按字面意思理解。您不能单独使用“A”到“Z”进行验证,因为在 EBCDIC 中,三组字母之间存在“间隙”,使用“A”到“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).
在文件匹配过程中,可以在文件末尾将键设置为高值,并且使用键仍然会导致其他文件被正确处理(键低于 on这个文件)。
这里是来自 SO 的一些问题的链接,这些问题与 88 级直接相关或与重要方面相关。
COBOL level 88 data type
Group variable in cobol
In Cobol, to test "null or empty" we use "NOT = SPACE [ AND/OR ] LOW-VALUE" ? Which is it?
Does a prefix of "NO" have any special meaning in a COBOL variable?
COBOL Data Validation for capital letter?