有没有办法使用INSPECT TALLYING检查多个字符?

ika*_*k90 3 cobol mainframe inspect

我有一个字符串,我希望计算字符的数量,直到找到一定的字符模式.

例如:

给一个字符串:askabanskarkartikrockstar
我想知道kartik在字符串之前有多少个字符.

在正常场景中,我需要k在给定字符串之前找到字符数,我会将代码编写为:

INSPECT WS-INPUT-STRING TALLYING CT-COUNTER FOR CHARACTERS BEFORE LT-K
Run Code Online (Sandbox Code Playgroud)

哪里

  • WS-INPUT-STRING是字母数字,值为 askabanskarkartikrockstar,
  • CT-COUNTER 是用于计算字符数的计数器
  • LT-K是一个有价值的文字k.

但是在这里,如果我希望对子字符串执行相同的操作,就像kartik在上面的示例中那样,将替换LT-Kwith 的值kartik而不是仅仅k工作?如果是,则同样适用于具有十六进制数字形式值的字母数字文字(例如,在文字中X(02)存储新行字符x'0D25')?

我正在尝试在zOS IBM大型机v10中实现上述代码.谢谢.

Nea*_*alB 8

你几乎回答了自己的问题......答案是肯定的,你可以做到这一点.这是一个工作示例程序:

  IDENTIFICATION DIVISION.
  PROGRAM-ID. EXAMPLE.
  DATA DIVISION.
  WORKING-STORAGE SECTION.
  01    WS-INPUT-STRING PIC X(80).
  01    WS-COUNTER      PIC 9(4).
  01    WS-TAG          PIC X(10).
  PROCEDURE DIVISION.
  MAIN-PARAGRAPH.
       MOVE 'askabanskarkartikrockstar' TO WS-INPUT-STRING
       MOVE ZERO                        TO WS-COUNTER
       MOVE 'kartik'                    TO WS-TAG
       INSPECT WS-INPUT-STRING
       TALLYING WS-COUNTER
       FOR CHARACTERS BEFORE WS-TAG(1:6)
       DISPLAY WS-COUNTER
       GOBACK
       .
Run Code Online (Sandbox Code Playgroud)

WS-COUNTER显示为11,WS-TAG字符串前有11个字符.

请注意,我定义WS-TAGPIC X(10).此变量比您要查找的实际标记值长.为防止INSPECT动词尝试匹配由以下引入的尾随空格:

      MOVE 'kartik' TO WS-TAG
Run Code Online (Sandbox Code Playgroud)

我必须指定一个参考修改值INSPECT来搜索.我只是用过:

      FOR CHARACTERS BEFORE WS-TAG
Run Code Online (Sandbox Code Playgroud)

没有参考修改,WS-COUNTER本来是80 - 长度WS-INPUT-STRING.这是因为'kartik '找不到字符串,计数器会计算整个输入字符串的长度.

另一种方法是将标记指定为文字:

      FOR CHARACTERS BEFORE 'kartik'
Run Code Online (Sandbox Code Playgroud)

您可以将十六进制常量移动到PIC X字段中,如下所示:

      MOVE X'0D25' TO WS-TAG
Run Code Online (Sandbox Code Playgroud)

这占用2个字符,因此您可以在使用WS-TAG(1:2)时使用INSPECT它.