s*******2 发帖数: 499 | 1 SAS advanced 50题有一道题是这样的。
The following SAS program is submitted:
%let a=cat;
%macro animal;
%let a=dog;
%mend;
%animal
%put a is &a;
Which one of the following is written to the SAS log?
Correct answer: d
a. a is
b. a is &a
c. a is cat
d. a is dog
这个题答案的讲解说用local macro variable.
但是sas online的学习资料给的讲解似乎相反(具体内如如下)。请指点迷津。多谢。
The %PUT statement within the macro definition will write the value of the
local variable dsn to the SAS log, whereas the %PUT statement that follows
the macro definition will write the value of the global variable dsn to the
SAS log:
%let dsn=sasuser.courses;
%macro printdsn;
%local dsn;
%let dsn=sasuser.register;
%put The value of DSN inside Printdsn is &dsn;
%mend;
%printdsn
%put The value of DSN outside Printdsn is &dsn;
When you submit this code, the following statements are written to the SAS
log.
SAS Log
199 %let dsn=sasuser.courses;
200
201 %macro printdsn;
202 %local dsn;
203 %let dsn=sasuser.register;
204 %put The value of DSN inside Printdsn is &dsn;
205 %mend;
206
207 %printdsn
The value of DSN inside Printdsn is sasuser.register
208 %put The value of DSN outside Printdsn is &dsn;
The value of DSN outside Printdsn is sasuser.courses |
n****e 发帖数: 226 | 2 第一个 %let a=cat; 已经把 macro variable &a 定义成了 global variable.
【在 s*******2 的大作中提到】 : SAS advanced 50题有一道题是这样的。 : The following SAS program is submitted: : %let a=cat; : %macro animal; : %let a=dog; : %mend; : %animal : %put a is &a; : Which one of the following is written to the SAS log? : Correct answer: d
|
s*******2 发帖数: 499 | 3 是啊,我知道这点。
可是第二个例子中用%put得到的就是global variable阿。
【在 n****e 的大作中提到】 : 第一个 %let a=cat; 已经把 macro variable &a 定义成了 global variable.
|
n****e 发帖数: 226 | 4 第二个例子里 macro 内的dsn是local macro variable
只在 macro 内部有效
如果你再加两个 %put statement 来显示 local MV, global MV
你会发现 %put _local_ 给你的是:PRINTDSN DSN sasuser.register
%put _global_ 给你的是:GLOBAL DSN sasuser.courses
%macro printdsn;
%local dsn;
%let dsn=sasuser.register;
%put The value of DSN inside Printdsn is &dsn;
%put _local_;
%put _global_;
%mend;
【在 s*******2 的大作中提到】 : 是啊,我知道这点。 : 可是第二个例子中用%put得到的就是global variable阿。
|
s*******2 发帖数: 499 | 5 谢谢指点。我不明白的地方是在第一个例子里,在macro里面又定义了a,
我想a就有一个全局宏变量和一个局部宏变量。按照第二个例子,
%%put a is &a; 输出的应该是全局变量的值。可是答案却不是这样。
请问第一个例子和第二个例子有什么不同?好像都是有一个全局宏变量和一个局部宏变
量。
【在 n****e 的大作中提到】 : 第二个例子里 macro 内的dsn是local macro variable : 只在 macro 内部有效 : 如果你再加两个 %put statement 来显示 local MV, global MV : 你会发现 %put _local_ 给你的是:PRINTDSN DSN sasuser.register : %put _global_ 给你的是:GLOBAL DSN sasuser.courses : %macro printdsn; : %local dsn; : %let dsn=sasuser.register; : %put The value of DSN inside Printdsn is &dsn; : %put _local_;
|
n****e 发帖数: 226 | 6 两个例子的区别是第一个没有在 macro 里把 a 再定义成 local MV
你用 %put _local_;在第一 macro 里试一试看返回什么
【在 s*******2 的大作中提到】 : 谢谢指点。我不明白的地方是在第一个例子里,在macro里面又定义了a, : 我想a就有一个全局宏变量和一个局部宏变量。按照第二个例子, : %%put a is &a; 输出的应该是全局变量的值。可是答案却不是这样。 : 请问第一个例子和第二个例子有什么不同?好像都是有一个全局宏变量和一个局部宏变 : 量。
|
s*******2 发帖数: 499 | 7 明白了,谢谢。我在家没法用SAS,不过明白你的意思。你是不是说第一个例子,
在macro里面的a仍然是global variable?
【在 n****e 的大作中提到】 : 两个例子的区别是第一个没有在 macro 里把 a 再定义成 local MV : 你用 %put _local_;在第一 macro 里试一试看返回什么
|
n****e 发帖数: 226 | 8 Yes.
From the SAS website:
"In most cases, once you define a global macro variable, its value is
available to you anywhere in the SAS session or job and can be changed
anywhere. So, a macro variable referenced inside a macro definition is
global if a global macro variable already exists by the same name (assuming
that the variable is not specifically defined as local with the %LOCAL
statement or in a parameter list). The new macro variable definition simply
updates the existing global one. "
There are two exceptions to this rule, you can read more here:
http://support.sas.com/documentation/cdl/en/mcrolref/61885/HTML
【在 s*******2 的大作中提到】 : 明白了,谢谢。我在家没法用SAS,不过明白你的意思。你是不是说第一个例子, : 在macro里面的a仍然是global variable?
|
s*******2 发帖数: 499 | 9 多谢。
assuming
simply
【在 n****e 的大作中提到】 : Yes. : From the SAS website: : "In most cases, once you define a global macro variable, its value is : available to you anywhere in the SAS session or job and can be changed : anywhere. So, a macro variable referenced inside a macro definition is : global if a global macro variable already exists by the same name (assuming : that the variable is not specifically defined as local with the %LOCAL : statement or in a parameter list). The new macro variable definition simply : updates the existing global one. " : There are two exceptions to this rule, you can read more here:
|