全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
13903 11
2015-08-01
在做SAS ADVANCED 63题的时候,我发现有时宏变量引用时不加点有时却要加,这是为什么呢?
需要加点的:
Item 30
The following SAS program is submitted:
%let product=merchandise;
[_insert_%put_statement_]
and the following message is written to the SAS log:
the value is “merchandise”
Which macro statement wrote this message?
A. %put the value is ‘“‘&product.’”’;
B. %put the value is %quote(&product.);
C. %put the value is “&product.”;
D. %put the value is ““&product.””;


不需要加的:
Item 48
Given the following program and data:
data WORK.BDAYINFO;
infile datalines;
input Name $ Birthday : mmddyy10.;
datalines;
Alan 11/15/1950
Barb 08/23/1966
Carl 09/01/1963
;
run;
%let Want=23AUG1966;
proc print data=WORK.BDAYINFO;
[_insert_statement_]
run;
What is the WHERE statement that successfully completes the PROC PRINT and selects the observation for Barb?
A. where Birthday=&Want;
B. where Birthday=“&Want”;
C. where Birthday=“&Want”d;
D. where Birthday=‘&Want’d;


请问是为什么呢?谢谢!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2015-8-3 12:58:49
在你所列的例子里面加".”和不加".”是没有什么区别的,在引用宏变量时正规的写法是:"&”+宏变量名+”.“。但是在有些情况下是必须要加的,有些情况下不是必须加的。必须加的时候一般是在宏变量后面有"."时,比如:你想表达2.2,让你设宏变量%let a=2,这时在引用宏变量时前一个宏变量是必须要加点的,后一个就不是必须的,所以2.2用宏变量表达是:&a..&a. 或&a..&a。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2015-8-4 08:59:58
这样说不知道能不能帮助你理解:
1. 引用宏变量时,后面的"."是宏变量名字结束的标志。
    也就是,&符号和“.”之间的部分是宏变量的名字。
   注意这个点必须要紧跟在宏变量的后面,才能起到这个“标志”的作用。

2. 宏处理器并不十分挑剔这个“."。
    当没有”."的时候,宏处理器会从&符号开始,一直找到那个不能作为宏变量名字的字符为止(比如:空格,-,(,),> 等等), 把&符号和这个字符之间的那部分作为宏变量的名字。
例如:&abcde fgh 宏处理器会认为abcde是宏变量名;
         &abc-de fgh 宏处理器会认为 abc是宏变量名;
         &a .bcdefg 宏处理器会认为a是宏变量名,后面的部分,包括"."都会作为普通字符。
         & a. bcdef  由于&符号后面的字符不能作为变量名字的一部分,宏处理器不会尝试读取任何宏变量的值。
%let a=aaaaa;
%let abcde=aabbccddee;
%let abc=aaabbbccc;

%put &abcde fghi;
%put &abc-def;
%put &a .bcdef;
%put & a .bcdef;

3. 当需要明确告诉宏处理器&符号引用到什么位置,就需要用到"."了。%let a=aaa;
%put &a.bbbccc;

    楼上的2.2的例子也很好,&a..&a,两个"."中,前面一个是引用结束的标志,被宏处理器消费掉了;后面一个是普通字符“小数点”。

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2015-8-4 15:12:12
ls说得很好
也可以这么理解
&和.之间包括一个宏变量名称,在编译时原样替换成宏变量的值
如果宏变量后接的是如等号和空格等分隔符,则.可以省略,如%let sum=&a+&b,写成%let sum=&a.+&b.也对
但如果宏变量后接的是字母或数字,则.不可以省略

还有一种情况是宏变量名称中又有宏变量,如&&var&i,其中i=1,var1="bin",如果想得到"bingo",则需要用&&var&i..go,注意要加两个.
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2017-1-10 05:09:53
想问下48题为什么选C,   为什么要加double quotation marks and d?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2018-12-3 10:39:34
playmore 发表于 2015-8-4 15:12
ls说得很好
也可以这么理解
&和.之间包括一个宏变量名称,在编译时原样替换成宏变量的值
您好,没大看明白。想问下为什么有两个&,两个.
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群