06.データの分解

【2008/11/10 original author TAKAO】

いきなり「データの分解」が現れたのは、REXXにおいて他のプログラムを呼び出したりする際の引数、戻り値、入力を処理する、などにおけるキー”PARSE”がわからないと、やる気がなくなってしまうからです。PARSEはデータの分解を行う命令です。

シンタックス

形式は次のとおり

  • PARSE [UPPER]  ソース テンプレート

ソースから供給されたデータを、テンプレートに分解します。[UPPER]が入っていたら全部、大文字に変換します。ソースに許されているキーワードは次のとおり、

  • ARG 引数
  • EXTERNAL TSO/E端末かSYSTSIN
  • PULL スタックの最初の取り出し
  • SOURCE 現在のプログラムソース
  • VALUE 式の結果
  • VAR 変数のもつ値
  • VERSION REXXインタープリタの情報

です。

次は、テンプレートに使われる表現です。

  • 変数 (例:rec1 rec2)
  • プレースホールダー .(ピリオド)
  • 文字列パターン (例:’/’ “” “”)
  • 位置を示す (例:12+8)
  • パターンをもった変数

これだけじゃ、なんのことやらほとんどわからんと思います。例をあげますので、ゆっくり読んでください。

パターン

例1.

  • /* REXX */
  • DATA = "Hello, the world!"
  • PARSE VAR DATA w1 w2 w3
  • SAY w1 "/" w2 "/" w3

結果:

  • Hello, / the / world!

ブランクで文字を区切っていくというのが基本動作です。

例2.

  • /* REXX */
  • DATA = "Hello, the world!"
  • PARSE VAR DATA w1 . w3
  • SAY w1 "/" w2 "/" w3

結果:

  • Hello, / W2 / world!

.(ピリオド)プレースホールダは、このようにその場所の文字を無視させます。その結果、W2にはなにも割り当てられませんでした。これで欲しい文字列だけを変数に割り当てられます。

例3.

  • /* REXX */
  • DATA = "Hello, the world!"
  • PARSE VAR DATA w1 "," w2 w3
  • SAY w1 "/" w2 "/" w3

結果:

  • Hello / the / world!

注意してみてください。Helloから ,(カンマ)がなくなりました。場所あわせのため,を使ったため、W1にはHelloだけが割り当てられたのです。データを変えてみましょう。

例4.

  • DATA = "YAMADA,TAROU,34,TOKYO"
  • PARSE VAR DATA SEI "," MEI "," . "," BASHO
  • SAY SEI "/" MEI "/" BASHO

結果:

  • YAMADA / TAROU / TOKYO

カンマ区切りのcsvから必要なデータだけを抜き出すといったことが簡単にできます。

データがカンマなどで区切られていない代わりに、場所が決まっているという場合の取り出し方は次のとおりです。コンピュータの出力を処理する場合などは、むしろこのほうが多いかも知れません。

  • /*----- 123456789012345678901234567890123456789 */
  • DATA = "00000001 3F563F56 CCF53422 33652100 ..."

このデータで、頭から8文字目まではアドレス、欲しいデータは23文字目から4文字だとします(上の3422のところ)。書き方はいろいろ考えられます。素直に1文字目から長さ8をアドレス、23文字目から長さ4が値とすると、

  • PARSE VAR DATA 1 ADDRESS +8 . 23 VAL +4 .

となります。

さて、今まで “” や数字で指定したところをプログラムの変数で処理できないでしょうか?そのためには、次のようにします。

  • DATA = "00000001 3F563F56 CCF53422 33652100 ..."
  • OFFSET = 23
  • PARSE VAR DATA 1 ADDRESS +8 . =(OFFSET) VAL +4 .

変数で位置を指定する場合は、絶対位置なら=、相対位置ならば+を明示してください。

ソース

変数を入力とする場合は、上のパターンの学習でさんざんやりましたから、いいでしょう。他の入力をご紹介します。

端末

  • PARSE PULL INPUT
  • SAY INPUT

PULLは、スタックのところで学んだように、スタックになにもなければ端末の入力待ちとなります。その結果、エンターキーを押すまでの入力を得ることができます。

ARG
サブルーチンの引数を得る場合に使います。

  • CALL add 1,2
  • SAY RESULT
  • EXIT
  •  
  • add: PROCEDURE
  • PARSE ARG a,b
  • RETURN a + b

あとのソースはあまり使わないので、必要に応じてマニュアルを見てください。

【2008/11/10 original author TAKAO】