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运行了这个测试,它运行得很好。