首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SAS-Macro 中的那些语句(二)

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

作者头像
Setup
发布2019-10-20 18:46:44
1.5K0
发布2019-10-20 18:46:44
举报

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

局部宏变量

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

/*首先:我们在开放式代码中定义一个宏变量*/
%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)一下,则继承了最开始全局宏变量的属性)...那么就来看看声明一下后的效果...

/*首先:我们在开放式代码中定义一个宏变量*/
%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语句声明一下....那么还是来看看几行代码

/*首先:我们在开放式代码中定义一个宏变量*/
%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出宏变量的值...看看日志会出现什么情况....

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

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

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

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

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

%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;的选项,为啥这样加呢,因为避免如果没有创建这个宏变量,运行这个语句的时候是不会出警告的...那么来看一下一个例子...今天就这么多了,敬请期待后期内容...

%symdel macvar1 macvar2 /nowarn;/*删除所创建的宏变量*/
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-02-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 SAS程序分享号号号 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档