Cobol 有没有一种方法可以将检查计数与多个字符的检查结合使用?

Cobol 有没有一种方法可以将检查计数与多个字符的检查结合使用?,cobol,mainframe,inspect,Cobol,Mainframe,Inspect,我有一个字符串,我希望统计字符数,直到找到某个字符模式 例如: 给出一个字符串:askabanskartikrockstar 我想知道字符串中kartik前面有多少个字符 在通常情况下,我需要在给定字符串中找到前面的字符数,比如说k,我会将代码写为: INSPECT WS-INPUT-STRING TALLYING CT-COUNTER FOR CHARACTERS BEFORE LT-K 在哪里 WS-INPUT-STRING是字母数字,值为 Askabanskartikrockstar

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

例如:

给出一个字符串:
askabanskartikrockstar

我想知道字符串中
kartik
前面有多少个字符

在通常情况下,我需要在给定字符串中找到前面的字符数,比如说
k
,我会将代码写为:

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

  • WS-INPUT-STRING
    是字母数字,值为
    Askabanskartikrockstar
  • CT-COUNTER
    是用于计数字符数的计数器
  • LT-K
    是值为
    K
    的文本
但是在这里,如果我希望对子字符串执行相同的操作,如上例中的
kartik
,是否将
LT-K
的值替换为
kartik
,而不仅仅是
K
?如果是,同样适用于具有十六进制数形式值的字母数字文字(例如,在文字
X(02)
中,一个新行字符存储为
X'0D25'


我试图在ZosIBMMainframeV10中实现上述代码。谢谢。

你基本上已经回答了你自己的问题。。。答案是肯定的,你可以做到这一点。以下是一个工作示例程序:

  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
定义为
picx(10)
。此变量比您要查找的实际标记值长。要防止
INSPECT
动词尝试匹配由引入的尾随空格,请执行以下操作:

      MOVE 'kartik' TO WS-TAG
我必须为要搜索的
INSPECT
指定一个参考修改值。如果我只是使用:

      FOR CHARACTERS BEFORE WS-TAG
如果不进行引用修改,
WS-COUNTER
的长度将为80-
WS-INPUT-STRING
。这是因为找不到字符串
'kartik'
,计数器计算整个输入字符串的长度

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

      FOR CHARACTERS BEFORE 'kartik'
您可以将十六进制常量移动到
picx
字段中,如下所示:

      MOVE X'0D25' TO WS-TAG

这占用了2个字符,因此当
检查它时,您将使用
WS-TAG(1:2)

如果您想同时执行“大量”这项操作,那么您会发现执行速度会更快。它需要更多的打字,你需要更多的思考,出错的机会也更多。但是一旦你有一个工作,你只需要复制代码来重用它。

Hi@NealB,我尝试使用上述方法在有限长度变量中指定文字,例如
kartik
将保存在长度
X(06)
的变量中,
X'0D25'
将保存在
X(02)
变量中。该方法可以在变量中使用字母数字值。当我尝试为十六进制编码的字母数字值(如
X'0D25'
)计数计数器时,问题就出现了。在这里,它似乎只比较第一个字符,即当我在
X(01)
变量中给出
X'0D'
时,它是有效的,但当我尝试将
X(02)
变量与
X'0D25'
进行比较时,它无法计算正确的计数。@ikartik90最好再看一看您正在比较的变量的实际内容(可能其中一个包含双字节字符数据,另一个包含单字节字符)。我使用二进制数据测试了
检查计数
(例如,在X'0D00250D250025'中找到X'0D25',计数返回为3,这是正确的)。我明白了你的意思,而且,我已经非常明确地检查了我正在比较的变量的内容。我非常确定它的正确性。让我吃惊的是,当它工作时,当我测试它的子字符串时,为什么它不工作于十六进制子字符串。@ikartik90尝试从这个答案复制程序,然后
MOVE
WS-INPUT-STRING
WS-TAG
中我在前面的注释中给出的十六进制常量。我使用IBM Enterprise COBOL for z/OS 4.2.0运行了这个测试,它运行得很好。