SAS-Macro 中的那些语句(二)

2019-10-20 18:46:44 浏览数 (1)

昨天哪一篇说了宏变量定义的三种方式(SAS-Macro 中的那些语句(一)),今天接着昨天的说...还是围绕着宏变量进行展开,第一个问题,宏变量的作用域有限制么?答案也是有的,和其它的编程语言中的变量是一样的,SAS中的宏变量是分局部宏变量与全局宏变量...

局部宏变量

由于小编经验不足,可能会理解错,还请见谅与指正。局部宏变量是只作用在当前Macro内的,离开了这个Macro这个宏变量就不起作用了~所谓的作用,指的是赋值的值与是否存在该宏变量...一般情况下,如果这个宏变量之前没有在开放式代码(所谓的开放式代码指的是没有被%macro;%mend;包起来的代码...)中定义,在宏中直接定义的宏变量默认是局部宏变量,如果在该宏之前的开放式代码中也定义了同样名称的宏变量,如果在宏中没有加%local声明一下该变量,那么宏中的变量将继承前面的宏变量,如果重新赋值给改宏变量也是全局宏变量,并非局部宏变量....语言有点长,那么就来看看几句代码....

代码语言:javascript复制
/*首先:我们在开放式代码中定义一个宏变量*/
%let macvar1=WO SHI YI GE HAO REN;
/*放在封闭式代码中:在宏中再一次定义宏变量*/
%macro test;
%let macvar1=NI SHI YI GE HUAI REN;
%put NOTE:第二个解析值(宏内):&macvar1.;
%mend;
/*执行宏前的宏变量的值*/
%put NOTE:第一个解析值(宏外):&macvar1.;
/*执行宏中的宏变量的值*/
%test;
/*执行宏后的宏变量的值*/
%put NOTE:第三个解析值(宏外):&macvar1.;

看上面的代码:先猜猜的以此解析的三个宏变量的值是啥...(接下来看日志)

通过这个日志,不难发现,在该宏变量在执行宏前是:WO...在执行宏中是:NI...执行宏后:NI...,常理不应该是执行宏后的还是WO...么,这是为啥?原因是这样的,因为在执行宏之前,已经创建了宏变量(在开放式中创建的,为全局宏变量,在宏中如果没有声明(%local)一下,则继承了最开始全局宏变量的属性)...那么就来看看声明一下后的效果...

代码语言:javascript复制
/*首先:我们在开放式代码中定义一个宏变量*/
%let macvar1=WO SHI YI GE HAO REN;
/*放在封闭式代码中:在宏中再一次定义宏变量*/
%macro test;
%local  macvar1;
%let macvar1=NI SHI YI GE HUAI REN;
%put NOTE:第二个解析值(宏内):&macvar1.;
%mend;

/*执行宏前的宏变量的值*/
%put NOTE:第一个解析值(宏外):&macvar1.;
/*执行宏中的宏变量的值*/
%test;
/*执行宏后的宏变量的值*/
%put NOTE:第三个解析值(宏外):&macvar1.;

还是用一样的例子~只是在宏中添加了%local语句来声明一下宏变量...那么在来看看日志...

这回正常了吧,变成了WO....NI....WO....,局部宏变量就是这样的,最好用%local声明一下,因为有时候宏变量定义多了,万一忘了前面定义了同样的全局宏变量呢,所以建议有一个声明宏变量的好习惯...还有一个需要提一下,宏参数是局部宏变量还是全局宏变量呢,答案是局部宏变量哎,感觉就相当SAS自动给宏参数声明了一下%local....嗯,说完局部宏量那么就来在说说什么是全局宏变量...

全局宏变量

什么是全局宏变量呢,全局宏变量定义的值,可以作用在宏外,多个宏内..在开放式代码中定义的宏变量为全局宏变量...如果要在封闭式代码中定义全局宏变量,则需要用%global语句声明一下....那么还是来看看几行代码

代码语言:javascript复制
/*首先:我们在开放式代码中定义一个宏变量*/
%let macvar1=WO SHI YI GE HAO REN;
%macro test;
%put NOTE:第1个解析值(宏内):&macvar1.;
%mend;
%macro test1;
%put NOTE:第2个解析值(宏内):&macvar1.;
%mend;
%macro test2;
%put NOTE:第3个解析值(宏内):&macvar1.;
%mend;
%put NOTE:第0个解析值(宏外):&macvar1.;
%test;
%test1;
%test2;
%put NOTE:第4个解析值(宏外):&macvar1.;

在宏外定义一个全局宏变量,在多个宏内%put出宏变量的值...看看日志会出现什么情况....

看,上面宏变量的值,不管在宏外,宏内都起到作用...可能并不能太好的看出全局宏变量...那么在来看一个在宏内定义的宏变量(局部宏变量),在宏外解析,做对比...

代码语言:javascript复制
%macro test3;
%let macvar1=wo shi yi ge hao ren;
%put NOTE:第1个解析值(宏内):&macvar1.;
%mend;

%test3;
%put NOTE:第2个解析值(宏外):&macvar1.;

不用猜就知道~第二个值肯定是绿色的未解析的警告...那么还是在看看日志的截图

那么在宏中如何定义全局宏变量呢....其实和%local申明一样...还是在来看一个简单的例子...(日志就不看看...)

代码语言:javascript复制
%macro test4;
%global macvar1;
%let macvar1=wo shi yi ge hao ren;
%put NOTE:第1个解析值(宏内):&macvar1.;
%mend;

%test4;
%put NOTE:第2个解析值(宏外):&macvar1.;

全局宏变量实际写宏中作用多么~答案也是显然,非常常用,让宏变量在不同组件的宏中传递...就想下面一个rtf输出宏,用都个组成部分,之间参数的传递都是通过全局宏变量进行传递的...

检测宏变量存在与否

宏变量创建方式说完了,宏变量的类型说完了,那么就看看如何判断一个宏变量是否被创建,这个小编以前写过,在一个片推送中的一部分,那么小编就把链接贴这儿,点进去翻一翻即可发现:SAS-走近Log,实现程序的“风险控制”,如果不想翻一翻就看下面的一个截图,有点小...

删除宏变量

既然宏变量能在内存中创建,那么能不能删除呢?答案是可以删除的..创建方式很多,删除方式还是很简单的...%symdel语句,一般会在后面加一个/nowarn;的选项,为啥这样加呢,因为避免如果没有创建这个宏变量,运行这个语句的时候是不会出警告的...那么来看一下一个例子...今天就这么多了,敬请期待后期内容...

代码语言:javascript复制
%symdel macvar1 macvar2 /nowarn;/*删除所创建的宏变量*/

0 人点赞