COBOL 中带有“REPLACING”的“COPY”语句

Posted

技术标签:

【中文标题】COBOL 中带有“REPLACING”的“COPY”语句【英文标题】:"COPY" statement with "REPLACING" in COBOL 【发布时间】:2011-09-12 10:14:02 【问题描述】:

我收到编译错误,

在嵌套的“COPY”中找到带有“REPLACING”短语的“COPY”语句。

这是我们的编译设置,我们不能在嵌套副本中使用 REPLACING 动词。 我们有一本抄写本,其中包含多个带有替换动词的复制语句。 谁能帮我解决这个错误?

【问题讨论】:

错误信息说明了一切。尝试取消嵌套副本。显示一些代码以获得更多帮助。 (大约 30 年前,我与 cobol 合作过,我从没想过人们还在使用它 :-) 我们可以取消嵌套copybook..但是为了代码的可重用性,我们以这种方式创建了它。我只是想搜索是否有其他方法可以做到这一点。我的 COBOL PGM 包含:COPY ABC。和 Copybook ABC 有,COPY XYZ REPLACING ==:A:== BY ==B-==。复制 PQR 替换 ==:A:== BY ==B-==。复制 LMN 替换 ==:A:== BY ==B-==。 来自mainframegurukul.com/tutorials/programming/cobol/…:COPY 语句可以嵌套。但是,a) 嵌套的 COPY 语句不能包含 REPLACING 短语,带有 REPLACING 短语的 COPY 语句不能包含嵌套的 COPY 语句 b) 嵌套的 COPY 语句不会导致递归。但是不建议使用嵌套的 COPY 语句,因为它会影响程序的可读性。 【参考方案1】:

在 COBOL 中嵌套 COPYBOOKS 有点小技巧。一般来说 只有当它们不嵌套时,您才可以嵌套字帖 包含REPLACING 短语并且不会导致递归。

假设您有以下两个字帖:

COPYBOOK ABC

  01 :A:-VAR-A1     PIC X.
  01 :A:-VAR-A2     PIC X.
  COPY XYZ REPLACING ==:A:== BY ==B==.

COBPYOOK XYZ

  01 :A:-VAR-X1     PIC X.
  01 :A:-VAR-X2     PIC X.

COPYBOOK ABC 中的嵌套是不允许的,因为它包含 REPLACING 短语。

但是,您可以执行以下操作。从 COPYBOOK ABC 中删除 RELACING 所以 它变成:

COPYBOOK ABC

  01 :A:-VAR-A1     PIC X.
  01 :A:-VAR-A2     PIC X.
  COPY XYZ.

现在将 COPYBOOK ABC 包含到您的源程序中,如下所示:

  REPLACE ==:A:== BY ==B==.
  COPY ABC.
  REPLACE OFF.

REPLACE 指令导致所有出现的:A:B 替换,直到遇到REPLACE OFF 指令,并且这些 替换发生在所有COPY 指令都被执行之后。互联网 上述语句的结果将是:

  01 B-VAR-A1     PIC X.    <== from ABC
  01 B-VAR-A2     PIC X.    <== from ABC
  01 B-VAR-X1     PIC X.    <== Nested copy of XYZ from ABC
  01 B-VAR-X2     PIC X.    <== Nested copy of XYZ from ABC

这是对嵌套字帖进行替换的唯一“合法”方式 在我知道的 COBOL 中。

【讨论】:

非常感谢 Neal :) 我尝试了上述解决方案,它工作正常并解决了我的问题。非常感谢您节省了大量的精力和多余的编码:)【参考方案2】:

虽然 Neal 的回答对于他和 OP 正在使用的 Cobol 变体可能是正确的,但值得注意的是,一些 Cobol 编译器允许嵌套 COPY ... REPLACING 语句。

确实,我们有很多在代码中使用它的实例。

例如,我有许多 Cobol 模块程序,其中包含以下方式的 copymember:

COPY 'uwxxxxsel.prg' REPLACING
             LEADING "xxxxSEL" BY "AREASEL".

并且“uwxxxxsel.prg”复制成员包含另一个文件的以下COPY,如下所示:

COPY 'uwf8list.prg'
       REPLACING LEADING 'XXXXXX-F8-' BY 'SELECT-F8-'
                 ==FUNCTION-KEY== BY ==F8-FUNCTION-KEY==.

这很好用。

我将其用作通用功能的一种“继承”结构。

不过,我们的编译器有一个问题。更高级别的REPLACING 在嵌套的REPLACING 之后不会继续,但是只要嵌套的REPLACING 是copymember 中的最后一个,就可以了。

【讨论】:

以上是关于COBOL 中带有“REPLACING”的“COPY”语句的主要内容,如果未能解决你的问题,请参考以下文章

77 关于 java.util.concurrent.RejectedExecutionException:Thread limit exceeded replacing blocked worker

77 关于 java.util.concurrent.RejectedExecutionException:Thread limit exceeded replacing blocked worker

77 关于 java.util.concurrent.RejectedExecutionException:Thread limit exceeded replacing blocked worker

Replacing Threads with Dispatch Queues

使用 Cobol 5 编译器编译 Cobol 4

cobol中comp数据类型的小问题,请大虾帮忙