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

时间:2013-01-08 20:19:32

标签: cobol mainframe inspect

我有一个字符串,我希望计算字符数,直到找到某个字符模式。

例如:

提供一个字符串:askabanskarkartikrockstar
我想知道字符串中kartik之前有多少个字符。

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

INSPECT WS-INPUT-STRING TALLYING CT-COUNTER FOR CHARACTERS BEFORE LT-K

哪里

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

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

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

2 个答案:

答案 0 :(得分: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
       .

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

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

      MOVE 'kartik' TO WS-TAG

我必须指定INSPECT的参考修改值才能搜索。我只是用过:

      FOR CHARACTERS BEFORE WS-TAG

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

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

      FOR CHARACTERS BEFORE 'kartik'

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

      MOVE X'0D25' TO WS-TAG

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

答案 1 :(得分:0)

如果你想做很多事情"这一点,然后你会发现一个性能变化会更快。这是更多的打字,你必须多思考,并有更多的错误机会。但是一旦你有一个工作,你只需要复制代码以重用它。