上一篇谈到%在str和quote中具有mask的转义作用。SAS 程序冷知识——关于%quote系函数中%的转义问题 - 简书 和 SAS 程序冷知识——一个关于%str和%nrstr的案例解读 - 简书
但是在这些函数之外,%还有没有作用呢?
%put %abc.;
%put %%abc.;
执行后的结果是:
看起来是没有作用,但是:
%let a=%;
%let b=%;
%let c=%;
%let d=%&a.&b.&c.;
%put &d.abc;
%put %%%abc;
%put %%%&a.bc;
%put %%%%&a.bc;
%put %&d.%abc;
%put &a.&d.%abc;
%put %&a.&d.%abc;
%put %&a.&d.%&abc;
结果为:
因此我们猜测在宏函数str和quote之外,%依然有转义的作用,只不过是%%才是转义符(或者说函数内单个%首先被理解为转义符,但函数外首先被理解为普通字符)。
第一个put中4次转义的结果是:%%%%有转义作用,但a本身没有特殊性,故而没报错。
第二个put中有3个%,转义的结果为%%%没有转义作用,所以也没有触发warning。
第三个put中%%%没有转义作用,所以a被解析,没有找到宏bc故报错。
第四个put中,4个%有转义作用,mask了后面的&,使得a没有被解析。
第五个put中,d解析后,前两个%变成转义符,转义了a前面的&,后面3个%,同理会报warning。
第六个put和第五个同理。
第七个put,在a和d解析后为%%%&a.&b.&c.%abc,前3个%没有转义作用,使得第4-6个%没有转义作用,所以第7个作为触发符号使用,报warning。
第八个put,在a和d解析后为%%%&a.&b.&c.%&abc,前3个%没有转义作用,使得第4-6个%没有转义作用,所以第7个作为普通符号使用,报warning,但是报的是宏变量而不是宏的警告。
所以,我们猜测%作为转义符号的机制是这样的,首先将字符中所以同级别的宏变量解析,然后对百分号的转义从左到右进行分析。遇到可以解析的对象,则暂停转义,进行下一层宏变量解析,解析完毕后继续转义工作,直到遇到新的可以解析对象,以此类推。所以一个百分号会优先检查是否是转义符号,然后根据后面的字符判断是普通字符还是宏的触发符号。
在函数中,转义机制是转义符号在完成使命后会消失,但是函数外不会。同时函数内单个%首先被理解为转义符,但函数外首先被理解为普通字符(从而2个%才是转义符号)。
网友评论