CHG_VAR

1. Syntax

1  CHG_VAR ( name ,
1  old ,? new
1  , new
2  ,
1! 1
1 count
3  ,
1! 1
1 start
4  ,
1! 0
1 length
5  ,
1! ''
1 text_char
6  )

(FASTREXX プロシージャーで使用できます。)

注: 最後に指定された引数の後のコンマは省略可能です。

変数の中の old ストリングの 1 つ以上のオカレンスを new ストリングに変更します。また、正常に実行されると、OUTPOS の値も更新され、変数内で最後に変更されたフィールドの終わりから 1 バイト先の位置になります。

Returns
単一のブランク。
name
1 文字から 256 文字の変数 ID。変数名の突き合わせでは、大/小文字が区別されません。名前が検出されない場合、重大エラーが発生し、プロシージャーは終了します。システム文字変数またはシステム数値変数は使用できません。FASTREXX 変数の使用を参照してください。
old
変更する旧ストリング。この引数が省略されると、新規ストリングは start の位置に挿入されます。&varname を指定して、文字変数、数値変数、または TALLY リテラルを置換できます。ここで、varname は既存の変数名と一致します。
注:
  1. 数値は、先行ゼロが除去された表示画面形式に変換されます。
  2. 変数名が検出されない場合、ストリングはリテラルに解釈されます。
new
新規ストリング。この引数が省略されると、oldcount 個のオカレンスが削除されます。&varname を指定して、文字変数、数値変数、または TALLY リテラルを置換できます。ここで、varname は既存の変数名と一致します。
注:
  1. 数値は、先行ゼロが除去された表示画面形式に変換されます。
  2. 変数名が検出されない場合、ストリングはリテラルに解釈されます。
count
変更する old のオカレンスの 最大数。負でない整数でなければなりません。デフォルト値は 1 です。値が 0 の場合、すべてのオカレンスが変更されます。
start
old のオカレンスの検索を開始する変数内の 位置 (バイト単位)。以下のように指定できます。
絶対位置
正の整数である必要があります。デフォルト値は 1 です。start が変数の現在の長さより大きければ、この関数は無効になります。
現行変数位置からの相対位置
OPx または ONx、または Px または Nx、または IPx または INx として指定できます。結果の値がゼロ以下になる場合、関数はエラーになります。結果の値が現在の変数の長さより大きい値になると、この関数は無効になります。
length
old のオカレンスを検索する変数の 量 (バイト数)。負でない整数でなければなりません。デフォルト値は 0 です。値が 0 の場合、start から出力の残りの部分が検索されることを示します。lengthold より小さければ、この関数は無効になります。
text_char
ヌル・ストリングまたは単一文字を指定できます。

ヌル・ストリング (デフォルト) の指定は、CHG_VAR がテキストに依存することなく動作することを示します。

単一文字の指定は、特殊なテキスト依存型の文字を定義し、テキストに依存した変更動作が必要であることを示します。text_char に文字が指定されると、CHG_VAR は次のように動作します。

  • 新規ストリングと旧ストリングの長さが同じである場合、CHG_VAR は、テキストに依存した変更動作が要求されない場合と同じように動作します。
  • 新規ストリングが旧ストリングより短い場合、置換が行われると、CHG_VAR は置換されたストリングの終わりに続く最初の text_char 文字を検索します。レコード全体が検索される点に注意してください。text_char 文字が検出されると、この最初の後続文字の場所に追加の text_char 文字が挿入されて、newold の長さの差を埋めます。text_char 文字がレコードの残りで検出されない場合は、挿入は行われず、レコードの長さが短くなります。レコードが固定長で、不足を補う後続のアクションが行われない場合、File Manager レコード埋め込みプロセスにより、書き込み時にレコードが埋められます。

    意図された効果は、複数行のテキストが、text char 文字で区切られる列で位置合わせされた場合に、置換後も列で位置合わせされるようにすることです。これは、COBOL または JCL など右側にシーケンス番号があるファイルを更新する場合に有用です。

  • 新規ストリングが旧ストリングより長い場合、置換が行われると、CHG_VAR は置換されたストリングの右側で 2 つの連続した text_char 文字を検索します。レコード全体が検索される点に注意してください。2 つの連続した text_char 文字が検出されると、これらの文字は単一の text_char 文字に置き換えられます。このプロセスは、残りの単一文字 (その文字も含む) から開始して、oldnew のストリングの長さの差になるまで繰り返されます。このアルゴリズムを使用すると、複数の text_char 文字が単一の text_char 文字に減りますが、他の文字の間にある単一の text_char 文字が除去されることはありません。

    意図された効果は、ストリングにある既存の「ブランク」領域を使用して、可能な限り右側のテキストを未変更のまま残そうとすることです。この目的を達成するために十分な数の text_char 文字があることは保証されません。text_char 文字数が不十分である場合、レコードの残りは右側にシフトされ、長さが固定の場合は書き込み時に切り捨てられることがあります。これは、右側にシーケンス番号がある COBOL または JCL ソースなどのファイルを変更する場合に有用です。

  • 複数のストリング置換を指定している場合も (count が 1 より大きい場合)、その意図は同じです。検索は左から右に進められ、最初に検索引数が検査され、次に展開または縮小する text_char 文字が検査されます。検索引数は検出されると置き換えられ、検索は置換されたストリングの直後から続行されます。
  • ストリング置換が length 引数によりバイト位置に限定されることがある点に注意してください。ただし、追加または除去する text_char 文字の検索は、必要に応じて、その制限を超えてレコードの終わりまで続行されます。

例 1

現在の変数に「abcabcabcabcabcabcabc」が含まれているとした場合、以下を実行すると、

CHG_VAR(MYVAR,'abc','DeF',0)
/*  All occurrences of old within the             */
/*  variable are changed                          */

変数は「DeFDeFDeFDeFDeFDeFDeF」となります。

例 2

現在の変数に「abcabcabcabcabcabcabc」が含まれているとした場合、以下を実行すると、

CHG_VAR(MYVAR,'abc','DeF',,4)
/*  1 (default) occurrences of old changed,       */
/*  starting at position 4 within the variable    */

変数は「abcDeFabcabcabcabcabc」となります。

例 3

現在の変数に「aaaaaaaaaa」が含まれているとした場合、以下を実行すると、

CHG_VAR(MYVAR,'a','A',0,3,2)
/*  all occurrences of old changed, starting at   */
/*  position 3 in the variable, for a length of 2 */

変数は「aaAAaaaaaa」となります。

例 4

現在の変数に「abcabcabcabcabcabcabc」が含まれていて、現行変数位置が 4 であるとした場合、以下を実行すると、

CHG_VAR(MYVAR,'abc','DeF',1,P3)
/*  1 occurrence of old changed,                  */
/*  uses current position as the default target, therefore  */
/*  starts at position 7 within the variable      */

変数は「abcabcDeFabcabcabcabc」になり、変数位置は 10 に設定されます。

例 4

現在の変数に「abcabcabcabcabcabcabc」が含まれていて、現行変数位置が 13 に設定されているとした場合、以下を実行すると、

CHG_VAR(MYVAR,'abc','DeF',1,IN3)
/*  1 occurrence of old changed,                  */
/*  forces start to use current position value, therefore   */
/*  starts at position 10 within the variable     */

変数は「abcabcabcDeFabcabcabc」になり、変数位置は 13 に設定されます。