全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
5411 10
2016-01-13
%let Jun=abc;
%let text1=%bquote(May&Jun);
%let text2=%nrbquote(May&Jun);
%let text3=%str(May&Jun);
%let text4=%nrstr(May&Jun);

%put &text1;
%put &text2;
%put &text3;
%put &text4;

结果:
&text1=Mayabc
&text2=Mayabc
&text3=Mayabc
&text4=May&Jun

各位高手,请问上面的&text2为什么解析为Mayabc而不是May&Jun?不是说nr解析&和%做为普通字符吗?谢谢!
二维码

扫码加我 拉你入群

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

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

全部回复
2016-1-13 14:09:02
分2个阶段执行,先是编译阶段(compiled),再是执行阶段(executed)。

%nrbquote和%bquote在执行阶段屏蔽特殊字符。

复制代码

可以看到,%let text2=%nrbquote(May&Jun);的日志
复制代码

&Jun在编译阶段解析为abc,执行阶段Mayabc中无特殊字符。因此结果是Mayabc。

%STR and %NRSTR在编译阶段屏蔽特殊字符。
复制代码

编译阶段将&Jun视为普通字符,没有解析,因此&text4=May&abc
二维码

扫码加我 拉你入群

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

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

2016-1-13 15:47:07
孤单的我们 发表于 2016-1-13 14:09
分2个阶段执行,先是编译阶段(compiled),再是执行阶段(executed)。

%nrbquote和%bquote在执行阶段屏 ...
非常感谢!明白了一些,%nrbquote()在执行阶段解析,所以如果编译后的结果带特殊字符,该函数才起效。
例如,下面例子中,编译后&text2=May&abc,其中&abc没有被解析因为在执行阶段&被nrbquote()解析为普通字符。
但是,还有一些不明白,为什么下面&text5=May&abc而不是May123?

请继续指教,谢谢!

let abc=123;
%let Jun=%nrstr(&abc);
%let text2=%nrbquote(May&Jun);

%put &text2;

%let text5=%bquote(May&Jun);

%put &text5;
二维码

扫码加我 拉你入群

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

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

2016-1-13 16:00:16
caibirdcnb 发表于 2016-1-13 15:47
非常感谢!明白了一些,%nrbquote()在执行阶段解析,所以如果编译后的结果带特殊字符,该函数才起效。
例 ...
%let Jun=%nrstr(&abc);nrstr阻止了&abc的解析
%Jun解析为&abc,而&abc不会解析为123

二维码

扫码加我 拉你入群

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

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

2016-1-13 16:22:47
孤单的我们 发表于 2016-1-13 16:00
%let Jun=%nrstr(&abc);nrstr阻止了&abc的解析
%Jun解析为&abc,而&abc不会解析为123
不是很明白。
我知道nrstr阻止了&abc的解析,但那是编译期的事情。编译后应该是May&abc。
接着执行期对May&abc进行解析,应该能解析出May123啊,因为%bquote对&不生效。

麻烦讲解的通俗易懂些,我比较愚钝。谢谢!
二维码

扫码加我 拉你入群

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

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

2016-1-13 16:54:05
我的理解是:
%let Jun=%nrstr(&abc);
&Jun解析的时候,将&视为了普通文本。
该文本在%bquote(May&abc)时同样生效,%bquote并没有检测到需要解析的&
二维码

扫码加我 拉你入群

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

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

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

说点什么

分享

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