SAS 程序冷知识——一个关于%str和%nrstr的案例解读(续)

上一篇谈到%在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个%才是转义符号)。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容