我有一个字符串,我希望计算字符数,直到找到某个字符模式。
例如:
提供一个字符串: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中实现上述代码。感谢。
答案 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)
如果你想做很多事情"这一点,然后你会发现一个性能变化会更快。这是更多的打字,你必须多思考,并有更多的错误机会。但是一旦你有一个工作,你只需要复制代码以重用它。