3

我有一个字符串,我希望对其进行计数,直到找到某种字符模式。

例如:

给一个字符串: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-Kwithkartik替换的值会不会k起作用?如果是,是否同样适用于具有十六进制数字形式的值的字母数字文字(例如,在文字中将X(02)换行符存储为x'0D25')?

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

4

2 回答 2

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,字符串前有 11 个字符WS-TAG

请注意,我定义WS-TAGPIC 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)INSPECTing 时使用它。

于 2013-01-08T21:06:06.130 回答
0

如果你想一次做“很多”,那么你会发现 PERFORM VARYING 会更快。打字多了,你要多想,出错的机会也多。但是一旦你有一个工作,你只需要复制代码来重用它。

于 2013-01-09T01:04:03.303 回答