前のページ|次のページ

%STR関数と%NRSTR関数

%STR関数と%NRSTR関数の使用

特殊文字またはニーモニックが、マクロプロセッサによるマクロプログラムステートメントの構築方法に影響を与える場合、マクロクォーティング関数%STRまたは%NRSTRのいずれかを使用して、マクロのコンパイル中(または、オープンコード内のマクロプログラムステートメントのコンパイル中)にそれらの項目をマスクする必要があります。
これらのマクロクォーティング関数は、次の特殊文字とニーモニックをマスクします。
%STR関数と%NRSTR関数によってマスクされる特殊文字
空白
)
=
NE
;
(
|
LE
¬
+
#
LT
^
AND
GE
~
*
OR
GT
, (カンマ)
/
NOT
'
<
IN
>
EQ
これらの特殊文字とニーモニックに加えて、%NRSTRは&と%もマスクします。
注: 一致しない一重引用符、二重引用符、左かっこ、右かっこを%STRまたは%NRSTRで使用する場合、これらの文字の前にパーセント記号(%)を付ける必要があります。
%STRまたは%NRSTRを使用した場合、マクロプロセッサは、マクロの実行時にはこれらの関数とその引数を受け取りません。これらの関数はマクロのコンパイル時に動作するため、マクロプロセッサはこれらの関数の結果のみを受け取ります。マクロが実行される時点で、すでに文字列はマクロクォーティング関数によってマスクされています。したがって、%STRと%NRSTRは、SASコードのセクションなどの変化しない文字列をマスクするにの役立ちます。特に、%記号や&記号を含む文字列をマスクする場合は、%NRSTRを使用することをお勧めします。ただし、これらの関数は、マクロ変数への参照を含む文字列のマスクにはあまり役立ちません。これは、マクロ変数が、%STRや%NRSTRではクォーティングできない値に置換される可能性があるためです。

たとえば、その文字列に、マークが付いていない不一致の左かっこが含まれている可能性があります。一致しない引用符とかっこを%STRと%NRSTRと共に使用する

%STRまたは%NRSTRの引数に、一致しない一重引用符や二重引用符、または一致しない左かっこや右かっこが含まれる場合、それらの各文字の前に%記号を付ける必要があります。この方法について、いくつかの例を次の表に示します。
%STRと%NRSTRに渡す一致しない引用符とかっこにマークを付ける例
表記
説明
クォーティングされて格納される値
%'
一致しない一重引用符
%let myvar=%str(a%');
a'
%"
一致しない二重引用符
%let myvar=%str(title %”first);
title “first
%(
一致しない左かっこ
%let myvar=%str (log%(12);
log(12
%)
一致しない右かっこ
%let myvar=%str (345%));
345)

%記号を%STRと共に使用する

通常は、コンパイル時にマクロクォーティング関数を使用して%記号をマスクする場合、%NRSTRを使用します。%STRを使用して%記号をマスクできるケースが1つだけあります。それは、%記号の後ろに何もテキストが続かない場合です。この場合、マクロプロセッサによってマクロ名として解釈されます。%記号には、別の%記号によってマークを付ける必要があります。次に、例をいくつか示します。
%STRに渡す%記号をマスクする例
表記
説明
クォーティングされて格納される値
'%'
一致する一重引用符の前の%記号
%let myvar=%str('%');
'%'
%%%'
一致しない一重引用符の前の%記号
%let myvar=%str(%%%');
%'
""%%
一致する二重引用符の後の%記号
%let myvar=%str(""%%);
""%
%%%%
1行に含まれる2つの%記号
%let myvar=%str(%%%%);
%%

%STRの使用例

次の%LETステートメント内の%STR関数は、PROC PRINTの後ろのセミコロンが、%LETステートメントの末尾を示すセミコロンとして解釈されないようにしています。
%let printit=%str(proc print; run;);
さらに複雑な例として、次のマクロKEEPIT1は、マクロ定義内での%STR関数の動作を示しています。
%macro keepit1(size);
   %if &size=big %then %put %str(keep city _numeric_;);
   %else %put %str(keep city;);
%mend keepit1;
このマクロを次のように呼び出します。
%keepit1(big)
このコードは、次のステートメントを生成します。
keep city _numeric_;
%IF-%THENステートメントで%STR関数を使用すると、マクロプロセッサは、ワード%THENの後の最初のセミコロンをテキストとして解釈します。2番目のセミコロンは%THENステートメントの末尾を示し、その直後に%ELSEステートメントが続きます。したがって、マクロプロセッサは、これらのステートメントを意図したとおりにコンパイルします。しかし%STR関数を省略した場合、マクロプロセッサは、ワード%THENの後の最初のセミコロンを%THEN句の末尾として解釈します。その次のセミコロンは、定数テキストとして解釈されます。%ELSE句の前に記述できるのは%THEN句のみであるため、定数テキストのセミコロンがあることで、マクロプロセッサはエラーメッセージを発行し、このマクロをコンパイルしません。
%ELSEステートメントでは、%STR関数を使用することで、マクロプロセッサはステートメント内の最初のセミコロンをテキストとして扱い、2番目のセミコロンを%ELSE句の末尾として解釈できます。したがって、KEEPステートメントの末尾を示すセミコロンは、条件付き実行の一部になります。%%STR関数を省略した場合、最初のセミコロンが%ELSE句の末尾になり、2番目のセミコロンは条件付き実行の外側に位置します。これは、マクロが実行されるたびにテキストとして生成されます。(この例では、セミコロンの存在はSASコードに影響を与えません。)この場合も、%STRを使用することでマクロKEEPIT1を意図したとおりにコンパイルできます。
%STRを使用して、一致しない一重引用符が含まれる文字列をマスクする例を、次に示します。引用符の前で%記号を使用していることに注意してください。
%let innocent=%str(I didn%'t do it!);

%NRSTRの使用例

マクロ変数の(値ではなく)名前を%PUTステートメントによって出力する場合を考えます。これを行うには、次の例のように、%NRSTR関数を使用して&をマスクし、マクロ変数が置換されないようにする必要があります。
%macro example;
   %local myvar;
   %let myvar=abc;
   %put %nrstr(The string &myvar appears in log output,);
   %put instead of the variable value.;
%mend example;

%example
このコードによって、次のテキストがSASログに書き込まれます。
The string &myvar appears in log output, instead of the variable value.
%NRSTR関数を使用しなかった場合、または%STR関数を使用した場合、次のような望ましくない出力がSASログに表示されます。
The string abc appears in log output, instead of the variable value.
%NRSTR関数は、&がマクロ変数置換のトリガにならないようにします。
マクロ定義に、通常はマクロプロセッサによってマクロ変数参照として認識されるパターンが含まれる場合にも、%NRSTR関数は役立ちます。次にプログラム例を示します。
%macro credits(d=%nrstr(Mary&Stacy&Joan Ltd.));
   footnote "Designed by &d";
%mend credits;
%NRSTRを使用することで、マクロプロセッサは、&STACYと&JOANを単にDの値のテキストの一部として扱うことができます。そのため、マクロプロセッサは、マクロ変数参照を置換できないことを示す警告メッセージを発行しません。Dのデフォルト値を使用して、次のようにマクロCREDITSを呼び出したとします。
%credits()
このプログラムをサブミットすると、次のFOOTNOTEステートメントが生成されます。
footnote "Designed by Mary&Stacy&Joan Ltd.";
%NRSTR関数を省略した場合、マクロプロセッサは、&STACY参照と&JOAN参照を、FOOTNOTEステートメント内の&Dの置換の一部として置換しようとします。そのようなマクロ変数は存在しないため、マクロプロセッサは次の警告メッセージを発行します(ただし、マクロのシステムオプションで説明されているSERRORシステムオプションが有効であることが前提です)。
WARNING: Apparent symbolic reference STACY not resolved.
WARNING: Apparent symbolic reference JOAN not resolved.
%NRSTRを使用する最後の例を示します。マクロ関数名を含む、This is the result of %NRSTRという文字列を作成する場合を考えます。 次に、このプログラムを示します。
%put This is the result of %nrstr(%nrstr);
コンパイル時に、%NRSTRを使用して%記号をマスクする必要があります。そうすることで、マクロプロセッサは2回目の%NRSTRを呼び出しません。%NRSTRを使用して文字列%nrstrをマスクしないと、マクロプロセッサは、関数の左かっこが欠損していることを示すエラーメッセージを発行します。
前のページ|次のページ|ページの先頭へ