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中实现上述代码.谢谢.
你几乎回答了自己的问题......答案是肯定的,你可以做到这一点.这是一个工作示例程序:
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-TAG为PIC 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它.