SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1623|回复: 6
打印 上一主题 下一主题

宏变量问题的精彩解说

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2003-12-17 23:37:31 | 只看该作者

宏变量问题的精彩解说

我看到一个宏中间有这样的一段程序(因为宏比较长不全部贴上来了)
proc freq data=&data.;
                tables &var. / missing;
                format &var. &fmt..;
        run;
        title;
我想请教的是:&data.这个宏变量后面的.有什么作用?&fmt..后面的..又有什么作用?在什么时候需要注意这些问题?望各位大虾不吝赐教,谢谢!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2003-12-18 17:44:06 | 只看该作者

Re: 一个宏中间的问题!

[quote="zhu963396":bb887]
我想请教的是:&data.这个宏变量后面的.有什么作用?&fmt..后面的..又有什么作用?在什么时候需要注意这些问题?望各位大虾不吝赐教,谢谢![/quote:bb887]

&data.这个宏变量后面的.有什么作用?
[color=blue:bb887]-- 是用来表示宏变量名的结尾标记[/color:bb887]

&fmt..后面的..又有什么作用?
[color=blue:bb887]--第1个.同上,用来表示宏变量&fmt.的结尾标记;第2个.表示格式format.[/color:bb887]

在什么时候需要注意这些问题?
[color=blue:bb887]理解了宏变量和宏的实质,这些就迎刃而解。[/color:bb887]

1)宏变量和宏实际上就是字符替换技术。SAS系统用.来表示宏变量名称的结尾,但遇到以下一些符号时也可结束宏变量名称,如空格 / ; 等等。所以您的程序中第1行和第2行中.可以省略。

说得再专业些就是:SAS宏编译器在对程序进行scan时,遇到以&开头和以.结尾(或者上述提到的其它符号)的字母就视为一个宏变量,然后到符号表(symble table,存放宏变量及其值的地方)中查这个宏变量所代表的字符,最后替换。

2)您不妨想想第3行是如何进行替换?

先分别替换&data.和&fmt.,然后组成了一个format名称。假定
&data.=DS &fmt.=FMT,则&var. &fmt..最终替换成 DSFMT. 。不妨试一下第3行如果没有.会替换成什么?

3)毫无疑问,不可少的.是万万不可少的,想想替换方法就应该清楚些

4)对于可写也可不写的.,根据习惯而定。有些人习惯都加上.,就同你的程序。我的习惯是只有在遇到空格时才省略。

SAS宏并不难,难在对它的实现方法的理解。下次COPY几个papers供参考。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2003-12-19 12:54:05 | 只看该作者
十分经典的解说!佩服!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2003-12-19 16:09:49 | 只看该作者
确实经典,正中问题的核心。

今后还请zibao多多指教呀!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2003-12-21 11:07:13 | 只看该作者
各位,

<!-- m --><a class="postlink" href="http://support.sas.com/usergroups/sugi/sugi28/hands_on/p192-28.zip">http://support.sas.com/usergroups/sugi/ ... 192-28.zip</a><!-- m -->

Hands On Workshop 192: Macro Power
Ian Whitlock and Quentin McMullen
SAS Users Group International (SUGI-28), Seattle WA, 2003

The basics of macro programming will be illustrated with many examples to execute and modify.  We will start with the concept of a macro as a parameter-driven unit of code, and then add macro decisions, looping, and variables. In the end we will have macros getting help from other macros to solve significant problems.

====================
这是Ian最近一次的讲座(及paper),是在SUGI28 。

Ian Whitlock是个非常热心的SAS-Ler,guru级别。若有兴趣可在SAS-L上查看Ian的posts,也可以在SUGI查看他写的许多papers。 我一直非常喜欢看他写的papers。

Ian 尤其乐意帮助初学者,深入浅出地讲解SAS的内在奥妙,大家可以用"Ian Whitlock" 和 "Newbie"查看部分posts。

SAS-L(browse at google): <!-- m --><a class="postlink" href="http://groups.google.com/groups?hl=en&amp;lr=&amp;ie=UTF-8&amp;safe=off&amp;group=comp.soft-sys.sas">http://groups.google.com/groups?hl=en&amp;l ... ft-sys.sas</a><!-- m -->

SUGI: <!-- m --><a class="postlink" href="http://support.sas.com/usergroups/sugi/proceedings/index.html">http://support.sas.com/usergroups/sugi/ ... index.html</a><!-- m -->

Hope _this_ helps,
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2003-12-23 00:44:25 | 只看该作者

Re to Zibao:

您的讲解真是一针见血,精辟精辟!
   有您这样的良师,使我对学好SAS充满信心,谢谢!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2004-3-3 16:24:45 | 只看该作者

不错!

GOOD! <!-- s:lol: --><img src="{SMILIES_PATH}/icon_lol.gif" alt=":lol:" title="Laughing" /><!-- s:lol: -->
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2025-1-8 15:36 , Processed in 0.104415 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表