美文网首页
SAS 程序冷知识——一个关于%str和%nrstr的案例解读(

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

作者: 生物统计与SAS研究员 | 来源:发表于2021-05-31 13:16 被阅读0次

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

    相关文章

      网友评论

          本文标题:SAS 程序冷知识——一个关于%str和%nrstr的案例解读(

          本文链接:https://www.haomeiwen.com/subject/nofbsltx.html