%macro abc(lb=);
option mlogic mprint symbolgen;
proc delete data=_all_;run;
%mend;
1、%abc(lb=Ae(mg)|Fe(%)|CLr(mL/hr));
2、%abc(lb=%str(Ae(mg)|Fe(%)|CLr(mL/hr)));
3、%abc(lb=%nrstr(Ae(mg)|Fe(%)|CLr(mL/hr)));
我们先制作如下宏ABC。在执行1的时候,参数lb中含有%,在执行的时候结果为:
看起来%没有对宏的结果造成影响。
但是如果我们在执行2中,把原来的参数套上%str,结果就无法执行了。
除非在%号前再加一个%,因为在%str和%nrstr中,%还有一个作用就是:遮蔽该函数无法遮蔽的符号。此处使用的代码如下:%abc(lb=%str(Ae(mg)|Fe(%%)|CLr(mL/hr)));
如果我们在执行3中,把%str换成%nrstr,看起来可以屏蔽%了,结果却依然没有任何变化。
但是如果我们在执行2中的百分号后随便加个字母,比如字母a,如下:%abc(lb=%str(Ae(mg)|Fe(%a)|CLr(mL/hr)));
如果我们在执行3中的百分号后随便加个字母,比如字母a,如下:%abc(lb=%nrstr(Ae(mg)|Fe(%a)|CLr(mL/hr)));
据此,我们得出结论,%nrstr虽然可以屏蔽%,但是无法屏蔽其作为遮蔽符号的含义,%后面跟随的不是字母,所以即使不加任何函数依然不会被当作宏的触发符号,这也是不加%str和%nrstr函数反而正常的原因。但一旦使用了%str和%nrstr函数,反而使得%具有了遮蔽功能,%后面的“)”就被遮蔽了,从而导致整个代码少了一个结束括号,导致宏程序无法结束。
所以结论是:%str和%nrstr虽然可以遮蔽一些符号,但是当里面涉及%的时候依然需要小心,%会被当作遮蔽符号的可能。%在函数中具体起到哪种作用关键看符号后跟的符号,如果是可以作为宏名字的符号,那么此处%被当作宏的触发符号,如果是一些特殊符号,则会被当作遮蔽符号。