是否可以像其他语言一样以某种方式在COBOL中记录变量?

时间:2019-06-28 16:54:57

标签: cobol mainframe cobol85

我知道有DIPSLAY操作数可以让您“记录”任何变量值。但是,我的问题是:是否可以做一些类似JavaScript的console.log的PHP var_dump之类的工作,当您给他们一个变量时,它们会打印出值和变量名。

例如,我有以下数据:

01 MY-DATA.
   05 FIRST-PART      PIC X(05) VALUE 'DATA1'.
   05 SECOND-PART     PIC X(05) VALUE 'DATA2'.

我的问题是:在我的日志中是否有某种类似的东西(只需调用一次并针对任何给定的变量):

  

“我的数据:”

     

“ FIRSTPART:DATA1”

     

“第二部分:DATA2”

谢谢

3 个答案:

答案 0 :(得分:4)

不适用于任何当前受支持的大型机IBM COBOL编译器(我看到您已经用“大型机”标记了您的问题)。

曾经有EXHIBIT语句,在Enterprise COBOL中为not implemented。该链接上有一些关于自己实现类似功能的讨论。

我为自己编写了一个ISPF编辑宏,以生成COBOL代码来执行等效的DISPLAY,如上面的IBM文档链接所示。

过度杀伤将被称为CEE3DMP,但众所周知,当我感到沮丧时会进行过度杀伤。

您也许可以使用其他更精细的语言环境dump services中的一种,例如CEEVDMP或CEEHDMP。

答案 1 :(得分:2)

大多数编程语言中没有内置选项(例如,许多OO编程语言都具有toString(或类似的方法),但这确实达到了对象所说的(并且可能根本不包含变量的单个实际内容)。

COBOL处理语句(例如您提到的DISPLAY),而var_dump是php的内置函数。不同的OO编程语言可以选择使用一种反射,从而允许您(具有一些先决条件)自行编写var_dump函数,但据我所知,不支持OO的COBOL编译器具有反射功能。

正如@cschneid所提到的,EXHIBIT statement(实际上,链接是我为它找到的最好的文档),但据我所知,没有支持它的实现将记录的子字段显示为像var_dump一样分开。 CEE3DMP作为z / OS不会帮您,因为它会转储您指定的所有内容-但您不能指定单个变量。那里的其他转储例程也不会按照您的要求进行工作(记录,分为多个子字段)。

因此要回答的问题是-“不,没有标准选项可以转储记录”。

如果您不受任何COBOL实现的限制,则可以将此语言功能添加到GnuCOBOL中,也可以在z / OS上用作64bit-COBOL;-)

答案 2 :(得分:1)

使用Enterprise COBOL V6R1,您可以在MY-DATA上使用JSON GENERATE语句,然后将输出从UTF-16转换为EBCDIC,然后显示。

   Working-storage section.
     01 MY-DATA.
       05 FIRST-PART      PIC X(05) VALUE 'DATA1'.
       05 SECOND-PART     PIC X(05) VALUE 'DATA2'.
     1 i pic 9999 comp.
     1 jn pic N(100).
   Procedure division.
     example.
       json generate jn from MY-DATA count i
       display function display-of(jn(1:i))
       stop run.

,输出结果如下:

{"MY-DATA":{"FIRST-PART":"DATA1","SECOND-PART":"DATA2"}}

这与您想要的不完全一样,但是更加接近。您可以轻松地将上面的示例更改为一个部分,然后执行它(就像一个“单次调用”)