2016年7月26日火曜日

マクロ言語入門9:マクロ変数とドット




まず今後マクロを使ううえで便利な%PUTステートメントについて紹介します。
以下構文の通り、%PUTステートメントで指定した文字列をログに表示する事が出来ます。


構文


   %PUT   文字列;



例1
%let X = ABCDE;
%put  &X;

ログ
ABCDE

マクロ変数Xの値をログに出力しています。


例2
%let X = ABCDE;
%put  マクロ変数 X に "&X" を指定しました。;

ログ
マクロ変数 X に "ABCDE" を指定しました。

文字列とマクロ変数を組み合わせてログに出力しています。




ドットの活用

以下は例2と同じようなプログラムですが、WARNINGが出てしまいます。

%let X = ABCDE;
%put  マクロ変数 X に&Xを指定しました。;

ログ
WARNING: Xを指定しました。のシンボリック参照を解決できません。


これは 「&Xを指定しました。」 という名前のマクロ変数があるのだと解釈してしまったため、「そんな名前のマクロ変数存在しないぞ!」 というWARNINGです。

「&X」 と 「を指定しました。 」というように分けて解釈させたい場合、マクロ変数名の後に ドット「.」を入れてあげます。

%let X = ABCDE;
%put  マクロ変数 X に&X.を指定しました。;

ログ
マクロ変数 X にABCDEを指定しました。

マクロ変数名の後のドットは展開後に消えます。




ドットの活用2

%let LIB=WORK;
data &LIB.DT1;
   A=1;
run;

ログ
NOTE: データセットWORK.WORKDT1は1オブザベーション、1変数です。

上記はデータセットDT1を保存するライブラリをマクロ変数LIBで指定するプログラムのつもりです。
しかしログを見ると実際できたデータセットは「WORK.WORKDT1」 となっています。


これは「&LIB.DT1」という文をSASが見たときに、「&LIB.」はマクロ変数の後にドットがついてるから、マクロ変数展開後にドットが消えて「WORKDT1」となってしまうからです。

以下のようにドットを2つ入れてあげると、展開後に1つだけドットが残ります。
%let LIB=WORK;
data &LIB..DT1;
   A=1;
run;
ログ
NOTE: データセットWORK.DT1は1オブザベーション、1変数です。




記事一覧

1. マクロ変数とは
2. マクロの登録と実行
3. 定位置パラメータ
4. キーワードパラメータ
5. クォート処理
6. クォート処理2
7. ループ処理
8. 条件分岐処理
9. ドット
10. &&
11. 演算評価
12. 補足




0 件のコメント:

コメントを投稿