%SCAN (文字の走査)

変更の始まり
%SCAN(検索引数 : ソース・ストリング {: 開始位置 {: 長さ}})
変更の終わり

%SCAN は、ソース・ストリングの中の検索引数の 1 桁目を戻し、または それが見付からない場合には 0 を戻します。

変更の始まり開始位置と長さは、検索するソース・ストリングのサブストリングを指定します。 開始位置のデフォルトは 1 であり、長さのデフォルトはソース・ストリングの残り部分です。 結果は、開始位置が指定されている場合でも、常にソース・ストリング内の 位置です。 変更の終わり

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

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

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

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

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

注: SCAN 命令コードとは異なり、%SCAN は検索ストリングの全オカレンスを 含む配列を戻すことはできません。また、その結果は %FOUND 組み込み関数を 使用してテストすることはできません。

%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
     pos = %scan ('oo' : source);

前の代入後、'oo' の開始位置は 'Dr. Doolittle' 内の 6 桁目であるため、pos の値は 6 です。

     pos = %scan ('D' : source : 2);

前の代入後、2 桁目以降で最初に見つかった 'D' は 5 桁目にあるため、pos の値は 5 です。

     pos = %scan ('D' : source : 2 : 3);

変更の始まり前の代入後、2 桁目以降の長さ 3 の部分では 'D' が見つからないため、posの値は 0 です。変更の終わり

     pos = %scan ('D' : source : 2 : 4);

変更の始まり前の代入後、2 桁目以降の長さ 4 の部分を検索すると 'D' が見つかるため、pos の値は 5 です。変更の終わり

     pos = %scan ('abc' : source);

前の代入後、'Dr. Doolittle' 内に 'abc' は見つからないため、pos の値は 0 です。

     pos = %scan ('Dr.' : source : 2);

前の代入後、検索が 2 桁目で開始された場合は、'Dr. Doolittle' 内で 'Dr.' は見つからないため、pos の値は 0 です。

     srchFld = 'Dr.';
     srchFldVar = 'Dr.';
     pos = %scan (srchFld : source);
     posTrim = %scan (%trimr(srchFld) : source);
     posVar = %scan (srchFldVar : source);

前の代入後、srchFld は 10 バイトのフィールドであり、検索引数は 'Dr.' の後に 7 個のブランクが続いたものであるため、pos の値は 0 です。 ただし、%TRIMR と srchFldVar のどちらの走査にも、後にブランクを伴わない 3 バイトの検索引数 'Dr.' が使用されるため、posTrimposVar の値はいずれも 1 です。

%SCAN と %SCANR を比較する例については、%SCAN と %SCANR を一緒に使用する例を参照してください。