4

在很少有人说 cobol 好话的时候,他们经常提到“复制对应”(和“移动对应”)

我真的很想了解更多关于这些的信息——它们的语义是什么?是否与以下内容相同:

(Perl)

for my $key (keys %foo) {
    $bar{key} = $foo{key} if exists $bar{key};
}

还是有比这更深的东西?Cobol 记录是强类型的,对吧?这是如何运作的?

4

2 回答 2

4

根据 AcuCOBOL 文档(我使用):

当使用 CORRESPONDING 短语时,将 source-group 中选定的基本项目移动到 dest-group 中的相应项目。这被视为一系列格式 1 MOVE 语句,每个对应的数据项对一个。

格式 1 移动如下所示:

将源项移动到 {dest-item}

给定以下文件和工作存储定义

DATA DIVISION.
FILE SECTION.
FD  PRODUCT-INFO-FILE.
01  PRODUCT-INFO-RECORD.
    03 PI-HOLD-PROD                 PIC  x(12).
    03 PI-HOLD-DESC                 PIC  x(30).
    03 PI-HOLD-DISC                 PIC  9(01).
    03 PI-HOLD-TOTAL                PIC  9(08)V99.

WORKING-STORAGE SECTION.
01  HOLD-FIELDS-DEST.
    03 WS-HOLD-PROD                 PIC  x(12).
    03 WS-HOLD-DESC                 PIC  x(30).
    03 WS-HOLD-DISC                 PIC  9(01).
    03 WS-HOLD-TOTAL                PIC  9(08)V99.

这样做:

MOVE CORRESPONDING PRODUCT-INFO-RECORD TO HOLD-FIELDS-DEST.

与这样做相同:

MOVE PI-HOLD-PROD  TO WS-HOLD-PROD.
MOVE PI-HOLD-DESC  TO WS-HOLD-DESC.
MOVE PI-HOLD-DISC  TO WS-HOLD-DISC.
MOVE PI-HOLD-TOTAL TO WS-HOLD-TOTAL.

这节省了 3 行代码。很多文件都比这更宽。

编辑:这也来自同一组文档...

下表概述了 MOVE 语句允许的源项和目标项的组合。表中的数字是本节中描述每种组合的“一般规则”数字:

Sending Category:   Receiving Item Category:
                    Alphabetic  Alphanumeric/Alphanumeric Edited    Numeric /Numeric Edited
Alphabetic          Yes (12)    Yes (13)                            No (15)
Alphanumeric        Yes (12)    Yes (13)                            Yes (14)
Alphanumeric Edited Yes (12)    Yes (13)                            No (15)
Numeric Integer     No (15)     Yes (13)                            Yes (14)
Numeric
Non-integer         No (15)     No (15)                             Yes (14)
Numeric Edited      No (15)     Yes (13)                            Yes (14)

'12. 当 dest-item 是字母时,根据标准对齐规则进行对齐和空格填充。

'13. 当 dest-item 是字母数字或字母数字编辑时,将根据标准对齐规则进行对齐和空格填充。如果 source-item 是带符号的数字,则不移动操作符号。如果符号占据单独的字符位置,则该符号字符不会移动,并且源项的大小被视为减一。

'14. 当 dest-item 为数字或编辑数字时,小数点对齐和零填充将根据标准对齐规则进行。如果 source-item 未签名,则将其视为正数。如果 dest-item 无符号,则移动 source-item 的绝对值。如果 dest-item 已签名,则其符号设置为 source-item 的符号。如果 source-item 是数字编辑的,则首先对其进行“反编辑”,以便 dest-item 接收相同的数值。

'15. 以下移动是非法的: 字母或字母数字编辑的数据项不得移动到数字或数字编辑的数据项。不能将数字或数字编辑的数据项移动到字母项。非整数数字数据项不能移动到字母数字或字母数字编辑的数据项。

于 2009-09-17T17:31:33.710 回答
4

实际上,元素名称必须完全相同才能使“移动对应”起作用。我使用的计算机使用“MOVE CORR”的快捷方式。我在寻找示例时实际上看到了“添加 CORR”。

DATA DIVISION.
FILE SECTION.
FD  PRODUCT-INFO-FILE.
01  PRODUCT-INFO-RECORD.
    03 PI-HOLD-PROD                 PIC  x(12).
    03 PI-HOLD-DESC                 PIC  x(30).
    03 PI-HOLD-DISC                 PIC  9(01).
    03 PI-HOLD-TOTAL                PIC  9(08)V99.

WORKING-STORAGE SECTION.
01  HOLD-FIELDS-DEST.
    03 PI-HOLD-PROD                 PIC  x(12).
    03 PI-HOLD-DESC                 PIC  x(30).
    03 PI-HOLD-DISC                 PIC  9(01).
    03 PI-HOLD-TOTAL                PIC  9(08)V99.

可以有多个具有相同名称的变量,因为它们由 '01' 级别限定。要引用这两个字段之一,必须说 PI-HOLD-PROD OF HOLD-FIELDS-DEST。

要移动所有值,可以使用

MOVE CORRESPONDING PRODUCT-INFO-RECORD TO HOLD-FIELDS-DEST.

在新记录或变量中移动字段时,这非常有用。

01 WS-DATE-YMD.
   03  YY             PIC 99.
   03  MM             PIC 99.
   03  DD             PIC 99.

01 WS-DATE-MDY.
   03  MM             PIC 99.
   03  FILLER         PIC X VALUE "/".
   03  DD             PIC 99.
   03  FILLER         PIC X VALUE "/".
   03  YY             PIC 99.


MOVE CORR WS-DATE-YMD TO WS-DATE-MDY.
于 2009-09-18T22:40:03.070 回答