前のページ|次のページ

マクロ変数の間接的な参照

式を使用して参照を生成する

これまでに示したマクロ変数参照は、1つのアンパサンドで始まる直接的なマクロ変数参照(&name)でした。一方、一連のマクロ変数に属するマクロ変数を間接的に参照できるということも、役に立ちます。これによって、マクロ変数参照が置換されるときに、その名前を決定できます。マクロ機能として、間接的なマクロ変数参照が提供されています。この機能によって、式(たとえば、CITY&N)を使用して一連のマクロ変数のうちの1つへの参照を生成できます。たとえば、マクロ変数Nの値を使用して、CITY1からCITY20までの名前を持つ一連のマクロ変数のうちの1つを参照できます。Nの値が8の場合、CITY8への参照になります。Nの値が3の場合、CITY3への参照になります。
この例の場合、必要な参照のタイプはCITY&Nですが、次の例は、CITYに&Nを加えた値を生成しません。
%put &city&n;  /* incorrect */
このコードは、マクロ変数CITYが存在しないことを示す警告メッセージを生成します。これは、マクロ機能が&CITYを置換してから&Nを置換し、それらの値を連結しようとするためです。
間接的なマクロ変数参照を使用する場合、マクロプロセッサに対して、強制的に2回以上マクロ変数参照をスキャンさせます。このプロセスでは2回目以降のスキャンで目的の参照を置換します。マクロプロセッサに強制的にマクロ変数参照を再スキャンさせるには、マクロ変数参照で2つ以上のアンパサンドを使用します。マクロプロセッサが複数のアンパサンドを検出した場合に行う基本的なアクションは、2つのアンパサンドを1つのアンパサンドに置換することです。たとえば、&Nの値をCITYに追加して該当する変数名を参照する場合、次のように実行します。
%put &&city&n;  /* correct */
Nの値が6の場合、マクロプロセッサがこのステートメントを受け取ると、次のステップが実行されます。
  1. &&を&に置換します。
  2. CITYをテキストとして渡します。
  3. &Nを6に置換します。
  4. マクロ変数参照(&CITY6)の先頭に戻り、最初から置換を再開し、CITY6の値を出力します。

単一のマクロ呼び出しを使用して一連のマクロ変数参照を作成する

間接的なマクロ変数参照を使用すると、%DOループの反復を使用することにより、単一のマクロ呼び出しによって複数の参照を生成することができます。次の例では、マクロ変数CITY1からCITY10までに、それぞれCary、New York、Chicago、Los Angeles、Austin、Boston、Orlando、Dallas、Knoxville、Ashevilleの値が格納されていることを前提にしています。
%macro listthem;
   %do n=1 %to 10; &&city&n
   %end;
%mend listthem;

%put %listthem;
このプログラムは、次の結果をSASログに書き込みます。
Cary New York Chicago Los Angeles Austin Boston Orlando Dallas Knoxville Asheville

3つ以上のアンパサンドの使用

間接的なマクロ変数参照では、任意の個数のアンパサンドを使用できますが、4つ以上を使用することはまれです。このタイプの参照では、使用するアンパサンドの個数にかかわらず、マクロプロセッサによって次のステップが実行されて参照が置換されます。
%let var=city;
%let n=6;
%put &&&var&n;
  1. 参照全体が左から右に向かって置換されます。アンパサンドのペア(&&)が検出された場合、そのペアは1つのアンパサンドに置換されます。その後、参照の次のペアが処理されます。この例では、&&&VAR&Nは、&CITY6になります。
  2. 前で得られた結果の先頭に戻り、左から右に向かって置換を再開します。すべてのアンパサンドが完全に処理されると、置換は完了です。この例では、&CITY6がBostonに置換されて、置換処理が終了します。
注: 間接的なマクロ変数参照の置換の実行中に、置換の一部にマクロ呼び出しを含めることはできません。
ヒント
場合によっては、三重のアンパサンドによって間接的なマクロ変数参照を使用すると、マクロプロセッサの効率が向上する場合があります。詳細については、効率的なマクロとポータブルマクロの作成を参照してください。
ヒント:
前のページ|次のページ|ページの先頭へ