SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 912|回复: 5
打印 上一主题 下一主题

<求助>Macro

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2009-7-19 10:02:37 | 只看该作者

<求助>Macro

%let val = aaa ;
%let testval = %str( %'&amp;val%' ) ;

data _null_ ;
  val = &amp;testval ;
  put 'VAL=' val ;
run ;

执行时提示error.如果改成如下:

data _null_ ;
  val = [color=#FF0000:q1hah3ri]%unquote[/color:q1hah3ri](&amp;testval) ;
  put 'VAL=' val ;
run ;

则没有问题了,各位能否解释一下为什么?谢谢!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2009-7-19 12:22:31 | 只看该作者

Re: <求助>Macro

%unquote()是去掉字符窜重重的单引号,如果不去掉引号就没有办法解析宏变量
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2009-7-19 12:55:58 | 只看该作者

Re: <求助>Macro

呵呵,貌似不是这个意思哦。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2009-7-23 17:48:05 | 只看该作者

Re: <求助>Macro

谢谢MyLoveSas的问题!
以前遇到这种问题,看log总看不出到底错在哪里,现在终于知道了.以下是我看帮助自己攒的,要是不对请指正,谢谢.
[code:2kjvswv1]%let val = aaa;         /* 宏变量val赋值aaa */
%let testval = %str(%'&amp;val%'); /* 宏变量testval赋值为'&amp;val'(使用%str()在编译阶段屏蔽&amp;和',其中%'是在%str()中屏蔽'的特殊写法) */

/* 在data步编译之前解除对宏变量&amp;testval的屏蔽 */
data _null_;
        /* 为数据集字符变量val赋值,期望的语句为:val='aaa'; */
    /*val = &amp;testval;  错误,在data步编译前未解除宏变量testval的屏蔽 */
        val = %unquote(&amp;testval);        /* 正确,使用%unquote()在data步编译前解除了屏蔽 */
        put 'VAL =' val; /* 在log打印数据集变量val的值 */
run;

/* 下面是去掉引号问题的简化版本 */
/*
%let val = aaa;
%let testval = %str(&amp;val);
data work&#46;temp;
        val = &quot;%unquote(&amp;testval)&quot;;
run;
*/[/code:2kjvswv1]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2009-7-26 12:44:44 | 只看该作者

Re: <求助>Macro

查看了下,如果不unquote宏变量testval,则变量val 是数值型(BEST12.),而'aaa'显然不能成功进行转换。应该是这个原因。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2009-7-28 22:42:36 | 只看该作者

Re: <求助>Macro

下面是SAShelp的例子。同意楼上的说法。
可以加一条语句测试下:%put &amp;testval.;
结果是:'aaa'
The following program generates error messages in the SAS log because the value of TESTVAL is still masked when it reaches the SAS compiler.

%let val = aaa;
%let testval = %str(%'&amp;val%');

data _null_;
  val = &amp;testval;
  put 'VAL =' val;
run;

This version of the program runs correctly because %UNQUOTE explicitly unmasks the value of TESTVAL.

%let val = aaa;
%let testval = %str(%'&amp;val%');

data _null_;
  val = %unquote(&amp;testval);
  put 'VAL =' val;
run;

This program prints this to the SAS log:

VAL=aaa
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-5 19:43 , Processed in 0.250013 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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