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置き換えるでしょうか? はいの場合、16 進数の形式の値を持つ英数字リテラルにも同じことが適用されますか (たとえば、リテラルでは改行文字を として格納します)?LT-KkartikkX(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-COUNTER11と表示され、文字列の前に11文字ありWS-TAGます。

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'

次のように、 16進定数をPIC Xフィールドに移動できます。

      MOVE X'0D25' TO WS-TAG

これは2文字を占めるので、使用するWS-TAG(1:2)ときに使用しINSPECTます。

于 2013-01-08T21:06:06.130 に答える
0

これを一度に「たくさん」実行したい場合は、PERFORM VARYING の方が高速であることがわかります。タイピングが多くなり、考える必要が増え、エラーが発生する可能性が高くなります。しかし、機能するようになったら、コードをコピーして再利用するだけです。

于 2013-01-09T01:04:03.303 に答える