SAS %STR %NRSTR %BQUOTE %NRBQUOTE %SUPERQ
可参考
遮蔽的实质是把被遮蔽的内容换成其他字符(开头结尾是字母中间是数字),
两个%%被解析成一个%
%put(%% %%%)不能被正确执行,最后一个%后需要有个空格,但在%BQUOTE %NRBQUOTE中遮蔽不成对的符号,不需要百分号。
1.%STR() %NRSTR() 在编译阶段起作用。
%STR就是用来遮蔽特殊字符(不包含& %);
%NRSTR也是用来遮蔽特殊字符,且还能遮蔽 & %;
被遮蔽的内容,可以理解他就是一个字符串。
1.1 遮蔽特殊符号以及不成对的符号
1.2 遮蔽宏符号
用%NRSTR();
如果使用%STR遮蔽%, 注意%后面不能是有效的SAS变量名(不已字符下划线开头)。%str(%2);这种写法完全没必要,因为2不需要转义。
在括号内,%用来转义 % 以及不成对的符号。
2.%QUOTE() %NRQUOTE() 在执行阶段对解析后的宏的值起作用。
当对解析后的值进行某些操作时,如果不用%QUOTE %BQUOTE,就会报错。
程序就是从左向右执行,执行到%quote就知道这个地方特殊,需要遮蔽。
如果时%upcase(%quote(&a1.))则扫描阶段没问题,执行阶段是直接执行upcase(;1+1=3),所以这么写报ERROR;
这个例子中如果不用%NRQUOTE,会进一步解析&G,所以报错。如果用了%NRQUOTE, 对结果遮蔽,不会进一步解析&G。
当在DATA步通过CALL SYSPUTX赋值宏变量时,有可能出现特殊字符。注意遮蔽。
2.1 %QUOTE遮蔽解析后的值。
2.2
3.%BQUOTE() %NRBQUOTE()
%NRSTR 还能遮蔽 %& , 阻止宏/宏变量的编译。但 %STR() %QUOTE() 也可遮蔽 %,认为此时不是在解析宏。%str(%') %str(%;)即%后紧跟的不是SAS有效变量名(不是字母下划线开头)
4. %SUPERQ(macro_var)
阻止宏进一步解析。
macro_var本身就是个宏变量,不需要再加&了。
不进一步解析macro_var值中宏,但是如果macro_var = &var,先解析var, 到最后一步解析(&和var被解析出来的值)
var1 = a;
a = d;
var2 = &b;
b = c;
%SUPERQ(VAR1) 等于 a
%SUPERQ(&VAR1) 等于 d
%SUPERQ(VAR2) 等于 &b
&VAR2. 等于 c