プロセルピナ
Top Internet
Mail
Private
Proxy
Capture
Device
Download Config
and
Words
Online
Help
Online
Home
[BACK]
Top > Proserpine Macro > variables

 
      PROSERPINE MACRO

プロセルピナマクロの変数
 
    Macro Top | Variables | Commands | Ex-Commands      


 

プロセルピナマクロの書式


詳細は プロセルピナマクロの書式 を参照してください。

変数への値の設定は setコマンド で行います。
このコマンドに限り、コマンド名部分の記述を省略できます。例えば、次の2行は同じ意味です。

  set: str[10]="あいうえお!"
  str[10]="あいうえお!"

setコマンドの右辺値は、設定したい値の単純な羅列です。 例えば、int[0] の整数値変数に1から10までを加算した値を設定したい場合は、

  int[0] = 1 2 3 4 5 6 7 8 9 10 ;

と記述します (この例では int[0] に 55 が設定されます)。
加算ですが、+の記号は不要です。減算するには負記号付きの数値を記述してください。 例えば、int[0] の整数値変数に1から10までを加算したあとに 20 を引いた値を設定したい場合は、

  int[0] = 1  2  3  4  5  6  7  8  9  10  -20 ;

と記述します。
減算する 20 の値が int[1] に設定されているときは、次のようになります。

  int[1] = 20 ;
  int[0] = 1  2  3  4  5  6  7  8  9  10  -int[1] ;

結果は 35 になります。

右辺値が単純な羅列なのは文字列でも同じです。 文字列変数 str[10] に AA、BB、CC を結合したものを設定するには、

  str[10] = "AA"  "BB"  "CC" ;

と記述することがきます。

整数値変数の加減乗除は culcコマンド で行います。setコマンドではありません。
culcコマンドはコマンド名部分を省略できません。

  int[1]=2000 ; // 2000の値を代入。(setコマンド)
  culc: int[1]+=500 ; // 500を加算 (culcコマンド)

culcコマンドは整数値変数の加減乗除のみが対象です。
文字列変数の += による結合は、setコマンドです。

  str[0]="あああ"  // str[0]に あああ を設定 (setコマンド)
  str[0]+="いいい"  // str[0]の末尾に いいい を結合 (setコマンド)


 

プロセルピナマクロの変数


  変数は配列のような表現をとり、配列のようにアクセスすることができます。

マクロの中では、 str[ ]strl[ ]の文字列変数、 int[ ]intl[ ]の整数値変数(signed-64bit)、 bin[ ]binl[ ]のバイト列変数 の6種類を使用することができます。
この他にマクロへの入力を受け付ける input[ ]の文字列配列 があります。

次のコードスニップは、int[1] の数値変数を使って10回ループを作成した例です。


10回ループ

数値(int[ ], intl[ ])も 文字列(str[ ], strl[ ], input[ ])も、 値の設定は setコマンド で行います。
文字列の結合は setコマンド、 バイナリデータ(bin[ ], binl[ ])の結合は同じく setコマンド、 数値の加算などは culcコマンド で行います。

古いマクロでは、long値整数(signed-64bit)は、文字列表現されたもので扱っていました。 詳細は、 文字列の+Longメソッドなどを参照してください。
(現在のマクロはint[ ]、intl[ ]の整数値変数は long値整数(signed-64bit) です)

 

ローカル変数とグローバル変数


文字列変数str[ ]、 整数値変数int[ ]、 バイト列変数bin[ ] はグローバル変数で、サブルーチンの中からアクセスしても、 外からアクセスしても、 同じ値を得ることができます。
それに対し、 strl[ ]intl[ ]binl[ ] はローカル変数で、サブルーチン内で値を設定・変更しても、 サブルーチンの呼び出し元に復帰したときには 元の値に戻っています。
→ gosubコマンド、returnコマンド(サブルーチン)

 

入力用のinput変数


  マクロの入力は input[ ] の文字列変数に格納されます。
str[ ]などと同じように配列のような表現をとり、 配列のようにアクセスすることができますが、 添え字(suffix)には数字しか指定できません。

  : str[1]="正常";
  : input[1]="正常";   // (入力用の変数ですが、値を設定することも可)

  : str["結果"]="正常";
  × : input["結果"]="正常";

input[0] は、入力文字列の先頭行を表します。 入力された行数は、 input.Length で取得することができます。

次のコードスニップは、入力された文字列を、0から始まる行番号をつけて そのままputコマンドで出力する例です。


入力をそのまま出力


 

数値から文字列への変換


整数値変数を文字列変数に代入すると、自動的に文字列に変換されます。
次の例では、文字列変数 str[10] に、 999 の文字列が設定されます。

  int[10]=999;
  str[10]=int[10];

次のように int[10] に 0x2AC のHex値表現で値設定していた場合は、str[10]には0x2ACの10進数表現である 684 の文字列が設定されます。

  int[10]=0x2AC;
  str[10]=int[10];

Hex表現(16進数)の文字列に変換したい場合は ToStringメソッド を使用します。6桁のHex表現にするには ToStringメソッドに "X6" の文字列を与えます。
次の例では、str[10]の文字列変数には 0002AC が設定されます。

  int[10]=0x2AC;
  str[10]=int[10].ToString("X6");

Unicode値を文字列に変換するには、Unicode値を整数値変数に代入してから ToCharメソッド を使用します。
Unicode値 0x2AC の文字は、w の文字を縦に2つ重ねたような文字ですが、 この文字を str[10] に設定するには、次のように記述します。

  int[10]=0x2AC;
  str[10]=int[10].ToChar;

次の例は、putコマンドで具体的に Unicode値 0x2AC の文字 ʬ を表示します。



【コピペで確認】 上記のサンプルコードは メモ帳モードで開いたテキストフォームにコピー&ペーストして、 テストモード実行で 動作確認することができます。

【注】  0x2AC.ToChar の表記はできません。一度、整数値変数に代入してください。

 

2次インデックス


文字列から1文字、バイト列から1バイトを取り出すには、 [ ][ ] の形式で記述します。
プロセルピナマクロでは1文字でも文字列、1バイトでもバイト列として扱います。

次の例(Sample1)は、 strl[10]に格納されている文字列 ABCDEF の先頭から3つめ(index値で2)が C の場合に、 結果に「3rd char is C」と設定するものです。




次のSample2は、int[ ] に対して2次インデックスを使用する例です。
int[ ] の場合、2次インデックスで得られる値は整数値ではなく、 「長さ1のバイト列」 になります。


Sample2

Sample2において、int[1]にはHex値で0x0dが設定されています。整数値は64bit(8バイト)なので、 これを2次配列でインデックスすると、
  int[1][0] : 0x0d (長さ1のバイト列)
  int[1][1] : 0x00 (長さ1のバイト列)
  int[1][2] : 0x00 (長さ1のバイト列)
  int[1][3] : 0x00 (長さ1のバイト列)
  int[1][4] : 0x00 (長さ1のバイト列)
  int[1][5] : 0x00 (長さ1のバイト列)
  int[1][6] : 0x00 (長さ1のバイト列)
  int[1][7] : 0x00 (長さ1のバイト列)
となります。
文字列をバイト列に 直接に代入する場合、UTF-8でエンコードされます。上記のSample2ブロックの例の場合、str[1]には \r の1文字が設定されていて、 それをbin[2]に代入しているので、bin[2]には \r をバイナリ化した 0x0d の1バイトが設定されます。
int[1][0]で得られたbin[1]のバイト列と、str[1]から得られたbin[2]のバイト列は、 内容は同じ0x0dの1バイトなので、 結果には「一致」と設定されます。

Bin.0x~ の形式で、バイト列を直接 int[ ] などの整数値変数 に設定する場合は Littleエンディアンになることに注意してください。
例えば、
  intl[10]=Bin.0x02AC
の記述でintl[10]にバイト列 0x02, 0xAC の2バイトを設定した場合、intl[10]の値は 0xAC02 になります。
  intl[10]=Bin.0x02AC // intl[10]は 0xAC02 (バイト列代入)
  intl[10]=0x02AC // intl[10]は 0x2AC (数値代入)

次の例は 0x01, 0x02, 0x03 の3バイトを int["例"] の整数値変数に設定し、 その数値をToStringメソッドで 6桁のHex文字列 に変換して表示します。



【コピペで確認】 上記のサンプルコードは メモ帳モードで開いたテキストフォームにコピー&ペーストして、 テストモード実行で 動作確認することができます。

上記例の実行結果は次のようになります。



int[ ]、intl[ ] の整数値変数は8バイト値(64bit)です。 bin[ ]、binl[ ] のバイト列変数に代入すると8バイト設定されます。
例えば、0x01, 0x02, 0x03 の3バイトを設定した binl[10] を intl[10] に代入すると 0x030201 の値が設定されますが、 これを binl[10] に戻すと、 0x01, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 の8バイトになります。

 

バイナリ変数


bin[ ] のグローバルバイナリ変数と、 binl[ ] のローカルバイナリ変数 が使用できます。

バイナリ変数に値を直接入れるには、 Bin.0x~ の書式で記述します。
次の例は、ローカルバイナリ変数 binl[10] に
  01 02 03 04 05 06 07 08 09 0A 0B 0C
の12バイトを設定します。

  binl[10]=Bin.0x0102030405060708090A0B0C

この例では binl[10] の先頭バイトは 0x01 の値に、 末尾バイトは 0x0C になります。
各バイトの取得は二次インデックスで表記します。例えば、先頭バイトは binl[10][0] で取得できます。

バイナリ変数は、ToStringメソッドでHEXダンプすることができます (文字列への変換)。
次の例を実行すると、
  0102030405060708090A0B0C
という文字列が表示されます。



ToStringメソッドでは "X2" のパラメータを忘れないようにします。 パラメータ指定のないToStringメソッドを使用した場合、 バイナリ変数にはUTF-8の文字列が設定されているものとして処理されます。
上記例を次のような記述でHEXダンプしようとするのは誤りです。
  × put: binl[10].ToString

バイナリ変数に文字列を代入した場合、文字列をUTF-8エンコードしたバイナリ値が設定されます。 例えば次の場合、
  binl[11]="あいうえお"
binl[11] に設定される値は
  E3 81 82 E3 81 84 E3 81 86 E3 81 88 E3 81 8A
の15バイトです。

次の例では、
  E38182E38184E38186E38188E3818A
  あいうえお
の2行が結果として出力されます。



上記例では、 strl[10] の文字列変数に binl[11] のHEXダンプが、 strl[11] の文字列変数には binl[11] をUTF-8エンコードの文字列として解釈したものが設定されています。

 

変数の添え字


  配列のようにアクセスするので、変数の [ ] 内には 添え字(suffix) を記述します。
添え字は、str[1] といった数値表現、または str["abc"] のような文字列表現で表します。
添え字に使う数値、文字列は自由です。ただし数値の場合、 signed-64bit で表現できないような大きな値(0xFFFFFFFF以上)は使用できません。


変数 int["conter"] を使った10回ループ

注: int["conter"] を int[conter] と書くのは間違いです。 [ ]内に直接に文字列を書く場合は、 "記号 で囲むのを忘れないようにします。

str[0]とstr[00]は、添え字が数値0である、同じ変数を意味します。 ただし、str[0] と str["0"] は全く別の変数です。 str[0]は「添え字が数値0の変数」を意味し、 str["0"]は「添え字が文字列0の変数」を意味します。

次の例では、カウンタ変数 int["conter"] を使って、str[0]からstr[9]までの変数に Hello の文字列を設定しています。
(setコマンドは先頭の set: 部分を省略して表記することができます)


str[0]からstr[9]までの変数に Hello と設定

 

Sample


  変数に値を設定する、やや複雑な例を次に示します。
次に示すサブルーチンの例は、 パラメータで渡された文字列を解析して、それをグローバル変数 str[ ] に設定する例です。
渡される文字列(strl[0])には、
  thread_id=1234&abc=1420&cms=Hello&code=Error ...
といったような各項目が &記号 で一列につなげられたものを想定し、それぞれの項目は、
  label=value
の形式とします。サブルーチンではこれを、labelの添え字でvalueの文字列が得られるようにします。たとえば、
  str["thread_id"]
とすれば、文字列 1234 を、
  str["cms"]
とすれば、文字列 Hello が得られるように処理します。


「label=value」形式から、変数を設定

&記号での切り出しには splitコマンド を使用しています。 この例では、 strl.index=10 の指定があるので、切り出された項目はstrl[10]以降に設定されます。
具体的には、strl[0]が
  thread_id=1234&abc=1420&cms=Hello&code=Error
の文字列だった場合、 strl[10]に thread_id=1234、 strl[11]に abc=1420、 strl[12]に cms=Hello、 strl[13]に code=Error の文字列が設定されます。

splitコマンドO:length=intl[10] の指定により、 切り出された個数は intl[10] に設定されます。
while文で、この個数分だけループしながらstr[ ]に値を設定していきますが、途中で、 記号 で区切られない項目が発見された場合は、break文でループを中断しています 。
[BACK]
プロセルピナ