RPG

277. %REPLACE の使用方法

%REPLACE という組込み関数を見ると、
当然「ある文字列を別の文字列に置換える」機能であると
思ってしまうのはごく当然のことであるが、実は期待はずれの機能でしかない。
%REPLACE というからにはリプレース、つまり置換えなのであるから指定文字列を
別の指定した文字列に置換えると IBM 以外の人は思ってしまうのだが
実は文字列を上書きするだけ、という単純な機能でしかない。

%REPLACE((置換文字列): (対象文字列): (置換え開始位置))

という構文であり、これは

%SIBST((対象文字列):開始位置:長さ) = 置換文字列

という命令と同じことである。
つまりある位置からの文字列を書き換えるだけである。

【 サンプル・ソース: TESTRPL3 】
 
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 であるので
混同しないようにあえて使い方を紹介したような次第である。