在极少数情况下,人say nice things about cobol, they often mention "copy corresponding" (and "move corresponding")。
我真的想更多地了解这些 - 他们的语义是什么?它是否相同:
(Perl)
for my $key (keys %foo) {
$bar{key} = $foo{key} if exists $bar{key};
}
还是有更深层次的东西? Cobol记录是强类型的,对吗?这有什么作用?
答案 0 :(得分:4)
根据AcuCOBOL文档(我使用):
使用CORRESPONDING短语时, 选定的基本项目 source-group被移动到 dest-group中的相应项。 这被视为一系列格式 1个MOVE语句,每个语句一个 相应的数据项对。
格式1移动如下所示:
移动源项目TO {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允许的dest-item 声明。表中的数字 是“一般规则”中的数字 这个部分是每个组合 描述:
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是数字编辑的,它是 “去编辑”首先使得dest-item 收到相同的数值。
'15。以下动作是非法的:编辑的字母或字母数字 数据项可能无法移动到 数字或数字编辑的数据项。 数字或数字编辑的数据项 可能不会被移动到字母 项目。非整数数字数据项 不能移动到字母数字或 字母数字编辑的数据项。
答案 1 :(得分:4)
实际上,要使“MOVE CORRESPONDING”工作,元素名称必须完全相同。我工作的电脑使用'MOVE CORR'的捷径。当我在寻找例子时,我实际上看到了“ADD 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.