楼主: 铃萝
14016 11

为什么宏变量有时引用后面要加“.” [推广有奖]

  • 0关注
  • 0粉丝

已卖:1809份资源

本科生

31%

还不是VIP/贵宾

-

威望
0
论坛币
15753 个
通用积分
2.6504
学术水平
2 点
热心指数
2 点
信用等级
0 点
经验
792 点
帖子
21
精华
0
在线时间
109 小时
注册时间
2013-2-26
最后登录
2025-10-11

楼主
铃萝 发表于 2015-8-1 21:51:49 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
在做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;


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

扫码加我 拉你入群

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

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

关键词:Successfully Merchandise observation successful statement following message product written

沙发
贾贡献 发表于 2015-8-3 12:58:49
在你所列的例子里面加".”和不加".”是没有什么区别的,在引用宏变量时正规的写法是:"&”+宏变量名+”.“。但是在有些情况下是必须要加的,有些情况下不是必须加的。必须加的时候一般是在宏变量后面有"."时,比如:你想表达2.2,让你设宏变量%let a=2,这时在引用宏变量时前一个宏变量是必须要加点的,后一个就不是必须的,所以2.2用宏变量表达是:&a..&a. 或&a..&a。
已有 4 人评分经验 论坛币 学术水平 热心指数 收起 理由
踩云飞 + 2 + 1 + 1 精彩帖子
李会超 + 60 精彩帖子
davil2000 + 1 精彩帖子
admin_kefu + 30 热心帮助其他会员

总评分: 经验 + 60  论坛币 + 32  学术水平 + 2  热心指数 + 1   查看全部评分

藤椅
pobel 在职认证  发表于 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,两个"."中,前面一个是引用结束的标志,被宏处理器消费掉了;后面一个是普通字符“小数点”。

已有 4 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
txc612036 + 1 + 1 精彩帖子
fromthenon + 1 + 1 精彩帖子
18353151352 + 1 + 1 + 1 精彩帖子
踩云飞 + 3 + 2 + 1 精彩帖子

总评分: 论坛币 + 3  学术水平 + 5  热心指数 + 4  信用等级 + 1   查看全部评分

板凳
playmore 发表于 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,注意要加两个.

报纸
made 发表于 2017-1-10 05:09:53
想问下48题为什么选C,   为什么要加double quotation marks and d?

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

7
supersu35 发表于 2018-12-5 01:39:15
18353151352 发表于 2018-12-3 10:39
您好,没大看明白。想问下为什么有两个&,两个.
i=1,var1="bin"
&&var&i..go => &&解析成一个&, var保持, &i解析成1, 第一个.用以定义其前面是一宏变量。即"&var1"和".go" =>&var1.go => &var1.解析为bin =>bingo

8
18353151352 发表于 2018-12-7 14:59:04
supersu35 发表于 2018-12-5 01:39
i=1,var1="bin"
&&var&i..go => &&解析成一个&, var保持, &i解析成1, 第一个.用以定义其前面是一宏变 ...
谢谢您,那第二个点呢“.go”是什么用法?

9
supersu35 发表于 2018-12-7 23:59:46
18353151352 发表于 2018-12-7 14:59
谢谢您,那第二个点呢“.go”是什么用法?
macro processor的解析过程:
1. 将&&var&i..go看成两部分 =>&&var&i. + .go
2. 将&&var&i.解析成&var1,第一次解析后&&var&i..go变成了&var1.go
3. 将&var1.go看成两部分 =>&var1. + go
2. 将&var1.解析成bin,第二次解析后&var1.go变成了bingo
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
18353151352 + 1 + 1 + 1 精彩帖子

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

10
18353151352 发表于 2018-12-10 10:47:49
supersu35 发表于 2018-12-7 23:59
macro processor的解析过程:
1. 将&&var&i..go看成两部分 =>&&var&i. + .go
2. 将&&var&i.解析成&var1 ...
谢谢您,理解了。原来go前面的“.”是跟着第一次解析后宏变量的,作为宏变量的结束。

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-30 10:47