楼主: bananacindy
11063 7

有关SAS中%nrstr()函数等macro quoting的问题 [推广有奖]

  • 0关注
  • 0粉丝

本科生

93%

还不是VIP/贵宾

-

威望
0
论坛币
757 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
517 点
帖子
50
精华
0
在线时间
169 小时
注册时间
2013-4-20
最后登录
2020-6-5

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
  1. %let a=begin;
  2. %put  %upcase(%nrstr(&a));
复制代码
   虽然看了很多相关帖子,但对于宏编译和宏执行的区别(比如%str() 和 %bquote()的区别)之类的问题还是很迷糊。上面的程序跑出来的结果是begin。请问%nrstr()函数在这里为什么没能发挥阻止宏变量&a解析的功能,让&a直接作为两个普通字符输出呢? 而%upcase()函数也没能执行大写功能,输出的begin还是小写形态。这是为什么呢?


思考了很久也不懂,还望版上大神能指点迷津,谢谢!



二维码

扫码加我 拉你入群

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

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

关键词:Macro CRO acr ING Mac produces 程序

沙发
pobel 在职认证  发表于 2015-2-28 15:10:01 |只看作者 |坛友微信交流群
我试着解释一下:
1. %nrstr()函数发挥了它的功能。
经过%nrstr()函数,&a并没有解析成begin,而是直接作为两个字符赋给了%upcase函数
比如可以比较下面两句:
%put  %upcase(&a);
%put  %upcase(%nrstr(&a));


2. %upcase函数也执行了其大写的功能。
%upcase函数收到的是 &a 这两个字符, 而%upcase() 函数将小写的a变成了大写的A。

3.接下来还有一点:%UPCASE does not mask special characters or mnemonic operators in its result, even when the argument was previously masked by a macro quoting function.
也就是%upcase()作用完之后,&回复了其功能,因此%put的是 &A解析后的值。

比如:
%put  %upcase(%nrstr(&a));
%put  %qupcase(%nrstr(&a));

下面这个帖子是对macro quoting的一点粗浅解释:
https://bbs.pinggu.org/thread-3111084-1-1.html

已有 2 人评分学术水平 热心指数 信用等级 收起 理由
Tigflanker + 2 + 2 + 2 我试着理解下,哈哈
木叶知秋 + 1 + 1 + 1 精彩帖子

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

使用道具

藤椅
bananacindy 发表于 2015-2-28 18:45:18 |只看作者 |坛友微信交流群
pobel 发表于 2015-2-28 15:10
我试着解释一下:
1. %nrstr()函数发挥了它的功能。
经过%nrstr()函数,&a并没有解析成begin,而是直接作 ...
非常感谢您的回答,太详尽易懂了!正在拜读链接里总结macro quoting的帖子,特别是讲%str 与 %bquote 在参数中包含宏变量或宏调用时发挥的不同功能那段,让我有了种豁然开朗的感觉,实在是厉害!

使用道具

板凳
zy3137041217 发表于 2015-11-15 11:28:05 |只看作者 |坛友微信交流群
pobel 发表于 2015-2-28 15:10
我试着解释一下:
1. %nrstr()函数发挥了它的功能。
经过%nrstr()函数,&a并没有解析成begin,而是直接作 ...
请问为什么%nrstr(&a)解析成&a之后不是直接继续解析a,而是先把a upcase捏?是因为&a是字符?

使用道具

报纸
pobel 在职认证  发表于 2015-11-17 09:15:12 |只看作者 |坛友微信交流群
zy3137041217 发表于 2015-11-15 11:28
请问为什么%nrstr(&a)解析成&a之后不是直接继续解析a,而是先把a upcase捏?是因为&a是字符?
用help里的这句应该可以解释“When you mask a special character with a macro quoting function, it remains masked as long as it is within the macro facility (unless you use the %UNQUOTE Function).“

是因为&符号在%nrstr()的作用下,会被当做普通字符对待,除非有某种去掉mask的操作出现,否则&都会当成普通字符处理。

使用道具

地板
zy3137041217 发表于 2015-11-18 11:58:56 |只看作者 |坛友微信交流群
pobel 发表于 2015-11-17 09:15
用help里的这句应该可以解释“When you mask a special character with a macro quoting function, it re ...
哦哦!就是%upcase之后相当于UNquote的作用?是否这种屏蔽的字符经过 除了宏引用函数之外的其它函数的作用 之后能够回复原来的作用捏?不好意思有点打破砂锅问到底了

使用道具

7
pobel 在职认证  发表于 2015-11-18 12:44:33 |只看作者 |坛友微信交流群
zy3137041217 发表于 2015-11-18 11:58
哦哦!就是%upcase之后相当于UNquote的作用?是否这种屏蔽的字符经过 除了宏引用函数之外的其它函数 ...
%UPCASE作用后,mask的效果就消失了,相当于upcase同时加上unquote。
屏蔽过得字符有的时候并不会自动恢复原来的作用,这时需要用%UNQUOTE

使用道具

8
zy3137041217 发表于 2015-11-19 08:40:59 |只看作者 |坛友微信交流群
pobel 发表于 2015-11-18 12:44
%UPCASE作用后,mask的效果就消失了,相当于upcase同时加上unquote。
屏蔽过得字符有的时候并不会自动恢 ...
哦哦!好的!明白了,非常非常感谢

使用道具

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

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

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

GMT+8, 2024-4-30 23:07