全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
3560 3
2012-01-09
options symbolgen;
%let Jun=test;
%let Period=%str(May&Jun);
%put Period resolves to: .
%let Period1=%upcase(%str(May&Jun));
%put Period1 resolves to: &period1;
%let Period3=%nrstr(May&Jun);
%put Period3 resolves to: &period3;
%let Period4=%upcase(%nrstr(May&Jun));
%put Period4 resolves to: &period4;
执行上面宏代码:LOG日志为:
1    options symbolgen;
2    %let Jun=test;
3    %let Period=%str(May&Jun);
SYMBOLGEN:  宏变量 JUN 解析为 test
4    %put Period resolves to: .
SYMBOLGEN:  宏变量 PERIOD 解析为 Maytest
SYMBOLGEN:  上一值中宏应引用的某些字符在显示时未加引用。
Period resolves to: Maytest
5    %let Period1=%upcase(%str(May&Jun));
SYMBOLGEN:  宏变量 JUN 解析为 test
6    %put Period1 resolves to: &period1;
SYMBOLGEN:  宏变量 PERIOD1 解析为 MAYTEST
Period1 resolves to: MAYTEST
7    %let Period3=%nrstr(May&Jun);
8    %put Period3 resolves to: &period3;
SYMBOLGEN:  宏变量 PERIOD3 解析为 May&Jun
SYMBOLGEN:  上一值中宏应引用的某些字符在显示时未加引用。
Period3 resolves to: May&Jun
9    %let Period4=%upcase(%nrstr(May&Jun));
SYMBOLGEN:  宏变量 JUN 解析为 test
10   %put Period4 resolves to: &period4;
SYMBOLGEN:  宏变量 PERIOD4 解析为 MAYtest
Period4 resolves to: MAYtest
请教问题1:%str()函数是在宏编译时候起作用而把&Jun解析了?
问题2:为什么%upcase(%nrstr(May&Jun))的结果为MAYtest?
一直困扰,请懂的人解释一下,谢!

二维码

扫码加我 拉你入群

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

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

全部回复
2012-1-9 15:20:18
1.%str()是对一般的字符及空格,操作符等(不包括%,&),在编译时mask.也就把这些东西仅纯粹当作文本。所以会解析&jun为 test.
2.%nrstr() 除了上面的,还对%,&在编译时mask.但是对运行的结果并不mask. upcase后的结果应该是 MAY&JUN,但是%nrstr() 对结果并不MASK,所以&JUN解析为test,最终结果为MAYtest.
二维码

扫码加我 拉你入群

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

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

2012-1-9 17:37:00
再请教一下关于%bquote函数的问题:
options symbolgen;
%macro test2(op);
   %if 7 %bquote(&op) 7 %then %put 1;
   %else %put 0;
%mend;
%test2(=)

Log日志为:
1    options symbolgen;
2    %macro test2(op);
3       %if 7 %bquote(&op) 7 %then %put 1;
4       %else %put 0;
5    %mend;
6    %test2(=)
SYMBOLGEN:  宏变量 OP 解析为 =
ERROR: 在需要数值操作数的 %EVAL 函数或 %IF 条件中发现字符操作数。条件是: 7 %bquote(&op) 7
ERROR: 宏 TEST2 将终止执行。
请牛人再解析一下:最后条件部分那一句话是怎么来的?
二维码

扫码加我 拉你入群

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

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

2012-1-9 22:09:14
编译后“=”被MASK.
你试试这个。
复制代码
二维码

扫码加我 拉你入群

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

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

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

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