前のページ|次のページ

%BQUOTE関数と%NRBQUOTE関数

%BQUOTE関数と%NRBQUOTE関数の使用

%BQUOTEと%NRBQUOTEは、マクロまたはオープンコード内のマクロ言語ステートメントの実行中に、値をマスクします。これらの関数は、可能な限りマクロ式を置換してから結果をマスクするようにマクロプロセッサに指示し、置換できないマクロ変数参照またはマクロ呼び出しに対して警告メッセージを発行します。これらの関数は、%STRおよび%NRSTRがマスクするすべての文字に加えて、マークが付いていないパーセント記号、マークが付いていない不一致の一重引用符と二重引用符、およびマークが付いていない不一致の左かっこと右かっこをマスクします。つまり、%STRや%NRSTRを使用する場合のように、一致しない引用符の前に%記号を付ける必要はありません。
%BQUOTE関数は、マクロ変数参照またはマクロ呼び出しを置換することによって生成されたすべてのかっこと引用符を、実行時にマスクするべき特殊文字として扱います。(この関数は、コンパイル時には、引数に含まれるかっこや引用符をマスクしません。)したがって、置換された値に含まれる引用符やかっこが一致しているかどうかは問題になりません。それぞれは、個別にマスクされます。
%NRBQUOTE関数は、可能であれば最初に値を検出した時点で置換したいが、その結果に含まれるどのアンパサンド、パーセント記号も%EVAL関数によって演算子として解釈されたくない場合に役立ちます。
置換できないマクロ変数参照またはマクロ呼び出しが%NRBQUOTE関数の引数に含まれている場合、マクロプロセッサは、警告メッセージを発行してからアンパサンドまたはパーセント記号をマスクします(ただし、マクロのシステムオプションで説明されているSERRORシステムオプションまたはMERRORシステムオプションが有効であることが前提です)。置換できないマクロ変数に対するメッセージを抑制するには、代わりに、このセクションで後述する%SUPERQ関数を使用します。
%BQUOTE関数と%NRBQUOTE関数は、実行時に動作するため、%STRや%NRSTRよりも柔軟です。そのため、マクロ変数参照を含む文字列をマスクする場合、%BQUOTE関数と%NRBQUOTE関数を使用することをお勧めします。

%BQUOTEの使用例

次の%IF-%THENステートメントでは、%BQUOTEを使用して、マクロ変数STATEがOR(Oregonを表す)に置換されることによるエラーを防いでいます。マクロプロセッサは、このORを、誤って論理演算子のORと解釈します。
%if %bquote(&state)=%str(OR) %then %put Oregon Dept. of
Revenue;
注: %STRを使用してもこの例は動作しますが、そのようなプログラムは堅牢でなく、良い実装でもありません。&STATEが何に置換されるのか保証できないため、コンパイル時に変数自体の名前をマスクするのではなく、%BQUOTEを使用して実行時にマクロ変数の置換結果をマスクする必要があります。
次の例のDATAステップでは、一重引用符を含む文字値を作成し、その値をマクロ変数に割り当てています。その後のマクロREADITでは、%BQUOTE関数を使用して、一致しない一重引用符を%IF条件として受け取ることを可能にしています。
data test;
   store="Susan's Office Supplies";
   call symput('s',store);
run;

%macro readit;
   %if %bquote(&s) ne %then %put *** valid ***;
   %else %put *** null value ***;
%mend readit;

%readit
DATAステップでSusan's Office Suppliesという値をSTOREに割り当てるときに、この文字列を二重引用符で囲むことで、一致しない一重引用符を文字列内で使用できるようにしています。SASは、STOREに次の値を格納します。
Susan's Office Supplies
CALL SYMPUTルーチンは、一致しない一重引用符を含むこの値を、マクロ変数Sに割り当てます。マクロREADIT内でSを参照するときに%BQUOTE関数を使用しない場合、マクロプロセッサは、%IF条件のオペランドが無効であることを示すエラーメッセージを発行します。
When you submit the code, the following is written to the SAS log:
***valid ***
前のページ|次のページ|ページの先頭へ