%SCAN (文字の走査)

%SCAN(search argument : source string {: start})

%SCAN は、ソース・ストリングの中の検索引数の 1 桁目を戻し、または それが見付からない場合には 0 を戻します。 開始位置が指定されている場合、検索はその開始位置から開始されます。 結果は、開始位置が指定されている場合でも、常にソース・ストリング内の 位置です。 開始位置のデフォルトの値は 1 です。

1 番目のパラメーターのタイプは、文字、図形、また は UCS-2 でなければなりません。2 番目 のパラメーターは、1 番目のパラメーターと同じタイプである必要があります。 3 番目 のパラメーターが指定されている場合、それは、小数点以下の桁数がゼロ である数値でなければなりません。

いずれかのパラメーターが可変長である場合、他のパラメーターの値は、 最大長ではなく、現在の長さに対して検査されます。

戻り値のタイプは符号なしの整数です。この組み込み関数は、符号なしの整数式が有効で あればどこでも使用することができます。

検索引数に後書きブランクが含まれている場合、スキャンはそれらの後書きブランクを含めて行われます。 例えば、'b' がブランクを表す場合、%SCAN('12b':'12312b') では 4 が戻されます。 後書きブランクをスキャンの対象に含めたくない場合には、検索引数で %TRIMR を指定してください。 例えば、%SCAN(%TRIMR('12b'):'12312b') と指定すると 1 が戻されます。

詳細については、ストリング命令または 組み込み関数を参照してください。

注:
SCAN 命令コードとは異なり、%SCAN は検索ストリングの全オカレンスを 含む配列を戻すことはできません。また、その結果は %FOUND 組み込み関数を 使用してテストすることはできません。
図 219. %SCAN の例
 *..1....+....2....+....3....+....4....+....5....+....6....+....7...+....
D*Name++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++
 
D source          S             15A   inz ('Dr. Doolittle') 
D pos             S              5U 0 
D posTrim         S              5U 0 
D posVar          S              5U 0 
D srchFld         S             10A 
D srchFldVar      S             10A   varying  
 /FREE     
     pos = %scan ('oo' : source);     
     // After the EVAL, pos = 6 because 'oo' begins at position 6 in     
     // 'Dr. Doolittle'.     
     pos = %scan ('D' : source : 2);     
     // After the EVAL, pos = 5 because the first 'D' found starting from     
     // position 2 is in position 5.     
     pos = %scan ('abc' : source);     
     // After the EVAL, pos = 0 because 'abc' is not found in     
     // 'Dr. Doolittle'.     
     pos = %scan ('Dr.' : source : 2);     
     // After the EVAL, pos = 0 because 'Dr.' is not found in     
     // 'Dr. Doolittle', if the search starts at position 2.     
     srchFld = 'Dr.';     
     srchFldVar = 'Dr.';     
     pos = %scan (srchFld : source);     
     posTrim = %scan (%trimr(srchFld) : source);     
     posVar = %scan (srchFldVar : source);     
     // After the EVAL, pos = 0 because srchFld is a 10-byte field, so     
     // the search argument is 'Dr.' followed by seven blanks.  However,     
     // posTrim and posVar are both 1, since the %TRIMR and srchFldVar     
     // scans both use a 3-byte search argument 'Dr.', no trailing blanks.  
 /END-FREE