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