%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
であるので
混同しないようにあえて使い方を紹介したような次第である。