代码之家  ›  专栏  ›  技术社区  ›  Sean McMillan

COBOL中的“复制对应”是什么,它是如何工作的?

  •  4
  • Sean McMillan  · 技术社区  · 16 年前

    很少有人 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记录是强类型的,对吗?这是怎么回事?

    2 回复  |  直到 12 年前
        1
  •  4
  •   Jim Ferrans    16 年前

    根据Acucobol文档(我使用的文档):

    当使用相应的短语时, 中的选定基本项 源组移动到 目标组中的对应项。 这被视为一系列格式 1个move语句,每个语句一个 对应的一对数据项。

    格式1移动如下:

    将源项移动到目标项

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

    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行代码。很多文件都比这个宽。

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

    下表概述了 源项和的组合 移动允许的目标项 语句。表中的数字 “一般规则”的数字在吗 每个组合的位置 描述:

    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。当目标项按字母顺序排列时,出现对齐和空格填充 根据标准对齐 规则。

    13。当dest项是字母数字或字母数字编辑时,对齐和 空间填充根据 标准对齐规则。如果 源项是带符号的数字, 操作标志未移动。如果 符号占用单独的字符 位置,那个符号字符不是 已移动,源项的大小为 被视为少了一个。

    14。当目标项是数字或数字编辑时,小数点 对齐和零填充 根据标准对齐 规则。如果源项未签名,则 被认为是积极的。如果 dest item is unsigned,the absolute 移动源项的值。如果 目标项已签名,其签名已设置 源项的符号。如果 源项是数字编辑的,它是 首先“取消编辑”,使目标项 接收相同的数值。

    15。以下移动是非法的:编辑了字母或字母数字 数据项不能移动到 数字或数字编辑的数据项。 数字或数字编辑的数据项 不能移动到字母 项目。非整数数值数据项 不能移动到字母数字或 字母数字编辑的数据项。

        2
  •  4
  •   Cathy Sullivan    16 年前

    实际上,元素名必须完全相同才能使“move corresponding”生效。我工作的计算机使用的是“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”级别限定。要引用这两个字段中的一个,必须说hold-fields-dest的pi-hold-prod。

    要移动所有值,可以使用

    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.