%SCANR (文字の逆方向走査)
%SCANR(検索引数 : ソース・ストリング {: 開始位置 {: 長さ}})
%SCANR は、ソース・ストリングの中で見つかった検索引数の最後の位置を戻します。検索引数が見つからなければ 0 を戻します。
開始位置と長さは、検索するソース・ストリングのサブストリングを指定します。 開始位置のデフォルトは 1 であり、長さのデフォルトはソース・ストリングの残り部分です。 結果は、開始位置が指定されている場合でも、常にソース・ストリング内の 位置です。
1 番目のパラメーターのタイプは、文字、図形、また は UCS-2 でなければなりません。2 番目 のパラメーターは、1 番目のパラメーターと同じタイプである必要があります。 3 番目と 4 番目のパラメーター (指定された場合) は、小数点以下の桁数がゼロの数値でなければなりません。
いずれかのパラメーターが可変長である場合、他のパラメーターの値は、 最大長ではなく、現在の長さに対して検査されます。
戻り値のタイプは符号なしの整数です。この組み込み関数は、符号なしの整数式が有効で あればどこでも使用することができます。
検索引数に後書きブランクが含まれている場合、走査はそれらの後書きブランクを含めて行われます。 例えば、'b' がブランクを表すとして、%SCANR('12b':'12b312') は 1 を戻します。後書きブランクを走査の対象から除外する場合は、検索引数で %TRIMR を使用します。 例えば、%SCAN(%TRIMR('12b'):'12b312') は 5 を戻します。
詳細については、ストリング命令または 組み込み関数を参照してください。
%SCANR の例
- 最も簡単な %SCANR の形式 (オペランドが 2 つの場合)
次の例はパスの中で最後にある名前を見つけるものです。
- lastSlash の値は、これに %SCANR 組み込み関数の結果が代入されると、27 になります。
- lastSlash はゼロでないため、ファイル名を取得するために %SUBST 組み込み関数が使用されます。 コードが完了すると、filename の値が "a.txt" になります。
path = '/home/locations/manchester/a.txt'; lastSlash = %SCANR('/' : path); 1 if lastSlash = 0; filename = path; else; filename = %SUBST(path : lastSlash + 1); 2 endif;
- %SCANR の第 3 オペランドを使用してソース・ストリング中の検索対象部分の開始位置を指定する
次の例はパス内のファイル名の接尾部を見つけるものです (接尾部がある場合)。
- ファイル名の先頭を示す最後のスラッシュの位置を見つけるために %SCANR が使用されます。
- ファイル名の先頭から始めて最後のピリオドの位置を見つけるために %SCANR が使用されます。 %SCANR 組み込み関数に開始位置を指定することによって、プログラムはパス内の無関係なピリオド ("st.johns" ディレクトリー内のピリオドなど) の検索を回避します。
- この例では、path 内の最後のスラッシュ以降にはピリオドがないため、suffix の値は空ストリングになります。
- しかし、path の値が "/home/locations/st.johns/report.txt" であった場合、suffix の値は "txt" になります。
path = '/home/locations/st.johns/report'; p = %SCANR('/' : path); 1 if p = 0; p = 1; // start the next search at the beginning endif; dot = %SCANR('.' : path : p + 1); 2 if dot = 0; suffix = ''; 3 else; suffix = %SUBST(path : dot + 1); 4 endif;
- %SCANR の第 4 オペランドを使用して検索対象部分の長さを指定する
次の例はパス内の最後にあるディレクトリーの名前を見つけるものです。
- 最終スラッシュがパスの 27 桁目に見つかります。
- 2 番目の %SCANR 組み込み関数は、スラッシュの検索を 1 桁目と 26 桁目の間でのみ行うことを示します。
- この例では p がゼロではないため、ディレクトリー名を取得するために %SUBST 組み込み関数が使用されます。 コードが終了すると、dir の値が "manchester" になります。
path = '/home/locations/manchester/a.txt'; dir = ''; p = %SCANR('/' : path); 1 if p > 0; p2 = %SCANR('/' : path : 1 : p - 1); if p2 > 0; dir = %SUBST(path : p2 + 1 : (p - p2 - 1)); endif; endif;
%SCAN と %SCANR を一緒に使用する例
次の例では、%SCAN と %SCANR が、同じオペランドを指定して使用されます。 %SCAN は先頭から検索し、%SCANR は末尾から検索するので、検索ストリング中に検索引数のオカレンスが複数ある場合は、これらの組み込み関数はそれぞれ異なる結果を戻します。
- %SCAN 組み込み関数によって戻される値は 1 です。
- %SCANR 組み込み関数によって戻される値は 24 です。
- これらの値は同じではありません。 つまり、ストリング中に "VALUE" のオカレンスが少なくとも 2 つあるということです。
string = 'VALUE 9.56, VALUE 7.3, VALUE 4.71';
p1 = %SCAN ('VALUE' : string); 1
p2 = %SCANR ('VALUE' : string); 2
if p1 <> p2;
moreThanOne = *ON; 3
endif;