MOVE ALL
上次说到MOVE字符类型(alphanumeric)是按左对齐原则的,但如果我想不断重复填充相同的字符呢?那就要用MOVE ALL了,比如MOVE ALL SPACE TO WS-A,那么WS-A空间将会全被填充为空格。
MOVE ALL有几个特性:
MOVE ALL后面的常量只能是一个字符。
MOVE ALL后面跟的只能是COBOL定义的常量(如SPACE,ZERO等等)和字面常量(就是单双引号中的字符,如'A','*')。MOVE ALL后面不能跟数据项,比如MOVE ALL WS-B TO WS-A,是不允许的。但有一种替代的方法,就是使用INSPECT,如INSPECT WS-A REPLACING CHARACTERS BY WS-B。WS-A将从左到右不断用WS-B填充(WS-B必须是一个字节的)。
对于COBOL定义的常量(如SPACE,ZERO等等),MOVE 【COBOL常量】等同于MOVE ALL 【COBOL常量】。
例:
---1----+----2----+----3----+----4----+----5----+
05 WS-A PIC X(5) VALUE 'ABCDE'.
05 WS-B PIC X(1) VALUE 'B'.
* 1.after move all zero
MOVE ALL ZERO TO WS-A
DISPLAY WS-A
* 2.after move all 'A'
MOVE ALL 'A' TO WS-A
DISPLAY WS-A
* 3.after replace by 'B'
INSPECT WS-B REPLACING CHARACTERS BY WS-B
DISPLAY WS-A
结果:
00000
AAAAA
BBBBB
INITIALIZE
INITIALIZE非常简单,就如你想的那样。初始化一个组合项,下面的子项:字母型(alphabet)和字符类型(alphanumeric)将被初始化为空格。数值型(numeric)将被初始化为0。编辑型(alphanumeric-edit)中占位的字符部分,如加号、点号等就初始为加号,点号,而数值部分初始为0。
值得注意的一点是FILLER和没有名字的数据项,INITIALIZE将不对他们进行操作。原因在于很多时候我们定义FILLER和没有名字的数据项都是为了不再改变他们的值。如果想改变他们还是有办法的,比如使用MOVE ALL SPACE TO WS-A,那么下面的FILLER和没有名字的数据项就变成空格了,或者算好他们的起始位置和长度,然后使用 MOVE WS-B TO WS-A(WS-START:WS-LEN)覆盖他们的值。
例:
---1----+----2----+----3----+----4----+----5----+
05 WS-GROUP.
10 WS-A PIC X(2) VALUE 'AB'.
10 WS-B PIC 9(2) VALUE '12'.
10 WS-C PIC +9.9 VALUE '+3.4'.
10 FILLER PIC X VALUE ','.
10 PIC X VALUE '*'.
* 1.original
DISPLAY WS-GROUP
* 2.after init,filler and no name item would not
* override
INITIALIZE WS-GROUP
DISPLAY WS-GROUP
* 3.move space to WS-GROUP,then init it.
MOVE ALL SPACE TO WS
INITIALIZE WS-GROUP
* 4.override filler and no name item,then init it
MOVE ',' TO WS-GROUP(9:1)
MOVE '*' TO WS-GROUP(10:1)
INITIALIZE WS-GROUP
结果:
AB12+3.4,*
bb00+0.0,*
bb00+0.0bb
bb00+0.0,*
b表示空格(x'40')