%REPLACE という組込み関数を見ると、
当然「ある文字列を別の文字列に置換える」機能であると
思ってしまうのはごく当然のことであるが、実は期待はずれの機能でしかない。
%REPLACE というからにはリプレース、つまり置換えなのであるから指定文字列を
別の指定した文字列に置換えると IBM 以外の人は思ってしまうのだが
実は文字列を上書きするだけ、という単純な機能でしかない。
%REPLACE((置換文字列): (対象文字列): (置換え開始位置))
という構文であり、これは
%SIBST((対象文字列):開始位置:長さ) = 置換文字列
という命令と同じことである。
つまりある位置からの文字列を書き換えるだけである。
0001.00 H DFTNAME(TESTRPL3) DATEDIT(*YMD/) BNDDIR('QC2LE')
0002.00 F********** %REPLACE のテスト ****************************************
0003.00 F*
0004.00 F**********************************************************************
0005.00 D USER S 10A INZ('MN00 ')
0006.00 D PASS S 10A INZ('MN99 ')
0007.00 D SRCDTA1 S 128A INZ('123<USER>4567890')
0008.00 D SRCDTA2 S 128A INZ('123[USER]4567890')
0009.00 D POS S 4S 0
0010.00
0011.00 *( 置換え )
0012.00 /FREE
0013.00 POS = %SCAN('<USER>':SRCDTA1);
0014.00 IF POS > 0;
0015.00 SRCDTA1 = %SUBST(SRCDTA1:1:POS-1) + USER +
0016.00 %SUBST(SRCDTA1:POS+6);
0017.00 ENDIF;
0018.00 /END-FREE
0019.00 *( 上書き )
0020.00 /FREE
0021.00 POS = %SCAN('[USER]':SRCDTA2);
0022.00 IF POS > 0;
0023.00 SRCDTA2 = %REPLACE(USER:SRCDTA2:POS);
0024.00 ENDIF;
0025.00 /END-FREE
0026.00 C SETON LR
0027.00 C RETURN
これは置換えと上書きの違いを示すサンプルである。
置換えとは SRCDTA1 の 「123<USER>4567890」 の <USER> の部分を
「MN00 」に置換える例であるが、私達が置換えとして期待するのは
%REPLACE ではなく
0015.00 SRCDTA1 = %SUBST(SRCDTA1:1:POS-1) + USER + 0016.00 %SUBST(SRCDTA1:POS+6);
という演算となる。
一方、上書きして SRCDTA2 の 「123[USER]4567890」 の [USER] の部分を
「MN00 」に置換える例である。
ここでは
0023.00 SRCDTA2 = %REPLACE(USER:SRCDTA2:POS);
によって %REPLACE によって実行しているが置換えではなく
指定した位置からの上書きであることに注意されたい。
%REPLACE という名前からは想像できない機能が %REPLACE であるので
混同しないようにあえて使い方を紹介したような次第である。