请选择 进入手机版 | 继续访问电脑版
楼主: caibirdcnb
4893 10

[问答] 请教一下%nrbquote的引用原理,谢谢! [推广有奖]

  • 0关注
  • 36粉丝

讲师

47%

还不是VIP/贵宾

-

威望
0
论坛币
1367 个
通用积分
16.5538
学术水平
67 点
热心指数
70 点
信用等级
64 点
经验
6762 点
帖子
206
精华
2
在线时间
433 小时
注册时间
2011-8-31
最后登录
2023-9-23

caibirdcnb 发表于 2016-1-13 13:31:55 |显示全部楼层 |坛友微信交流群

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
%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解析&和%做为普通字符吗?谢谢!
二维码

扫码加我 拉你入群

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

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

关键词:Quote Text ext TeX May

分2个阶段执行,先是编译阶段(compiled),再是执行阶段(executed)。

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

  1. option symbolgen;
  2. %let Jun=abc;
  3. %let text2=%nrbquote(May&Jun);
  4. %put &text2;
复制代码

可以看到,%let text2=%nrbquote(May&Jun);的日志
  1. SYMBOLGEN:  宏变量 JUN 解析为 abc
复制代码

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

%STR and %NRSTR在编译阶段屏蔽特殊字符。
  1. %let text4=%nrstr(May&Jun);
  2. %put &text4;
复制代码

编译阶段将&Jun视为普通字符,没有解析,因此&text4=May&abc
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
Tigflanker + 4 + 4 + 4 加满

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

使用道具

caibirdcnb 发表于 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;

使用道具

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

使用道具

caibirdcnb 发表于 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对&不生效。

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

使用道具

我的理解是:
%let Jun=%nrstr(&abc);
&Jun解析的时候,将&视为了普通文本。
该文本在%bquote(May&abc)时同样生效,%bquote并没有检测到需要解析的&
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
清辉了如雪 + 1 + 1 + 1 精彩帖子

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

使用道具

木叶知秋 发表于 2016-1-13 23:30:10 |显示全部楼层 |坛友微信交流群
之前很多人探讨过这个问题
https://bbs.pinggu.org/thread-1264384-1-1.html
https://bbs.pinggu.org/thread-819216-1-1.html
总是感觉还是很难完全说清楚,只有请论坛里面几位诸如Pobel的大神谁能总结下呵呵~

使用道具

Tigflanker 发表于 2016-1-14 13:39:53 |显示全部楼层 |坛友微信交流群
可以研习一下pobel大神的帖子:https://bbs.pinggu.org/thread-3111084-1-1.html

我多年收藏压箱底,第一次看完就已经花光了好几个春秋的勇气

使用道具

caibirdcnb 发表于 2016-1-15 15:12:10 |显示全部楼层 |坛友微信交流群
谢谢上面各位,关于下面的例子,我还是不能从逻辑上明白为什么&text5等于May&abc而不是等于May123。
我的逻辑是这样的:因为%bquote()在宏执行期才生效,所以宏编译期先解析May&Jun,其中由于%nrstr()的存在,&Jun被解析为&abc,于是May&Jun在宏编译期被解析为May&abc。然后到了宏执行期,%bquote()对特殊字符&并不生效,所以May&abc应该被解析为May123。但实际结果为May&abc。

请高手从逻辑上帮忙解释,谢谢!

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

%put &text2;

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

%put &text5

使用道具

caibirdcnb 发表于 2016-1-15 15:12
谢谢上面各位,关于下面的例子,我还是不能从逻辑上明白为什么&text5等于May&abc而不是等于May123。
我的逻 ...
引用pobel大神的例子:
  1. %macro mvar;
  2.      a
  3. %mend;

  4.   %macro putmvar;
  5.       %let %mvar=aaaa;
  6.        %put 2. &%mvar;
  7.        %put 3. %unquote(&%mvar);
  8. %mend;
  9. %putmvar
复制代码
  1. Note:2. &a
复制代码
  1. Note:3. &a
复制代码

%put 3的结果和%put 2一样,这里的%UNQUOTE需要在执行时才起作用,而在编译阶段已经认为&符号没有引用宏变量,而且这里并没有quote存在;

同理,%bquote(May&Jun)在编译阶段,将&Jun解析为&abc。
SAS认为&abc中的&符号没有引用宏变量,所以执行阶段%bquote(May&abc)没有解析abc。

正确引用的宏函数
%let abc=123;
%let Jun=%nrstr(&abc);
%let text5=%unquote(%bquote(May&Jun));

%put &text5;

执行阶段1:
%bquote(May&Jun)在编译阶段,将&Jun解析为&abc。&为普通文本。
%bquote认为&abc中的&符号没有引用宏变量,%bquote(May&abc)没有解析abc。
执行阶段2:
%unquote(May&abc)把字符&abc解析为123,因此结果为May123。

或者在%put时加上%unquote
  1. %put %unquote(&text5);
复制代码

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-3-29 14:44