如果在SAS宏中声明

时间:2014-02-07 22:15:43

标签: sas

%macro pp();
data temp1;
 set dir.data
 call symput('prod', product); 
run;
%put "&prod";
%if prod = "&prod" %then %do;
   %put "&prod";
%end;
%mend;
%pp();

为什么if语句的计算结果为false?

2 个答案:

答案 0 :(得分:4)

在SAS宏语言中,一切都是字符串,所以你的陈述

%if prod = "&prod" %then %do;

永远不会是真的;字符串 prod 永远不会等于字符串“& prod”,如果只是因为一个字符串包含双引号而另一个不包含双引号。

因此,双方使用双引号或根本不使用双引号。其中任何一个都会更好:

%if "prod" = "&prod" %then %do;
%if  prod  =  &prod  %then %do;

另外,请注意,在此修复之后,只有当您创建的宏变量具有 prod (这四个字符)的确切值时,该语句才会为“true”。案例事项: prod 不等于 PROD

答案 1 :(得分:1)

调试这样的事情的最好方法是将它放在%put语句中,我可以看到你已经尝试过,但它可能会有点棘手。因为你的比较陈述是:

%if prod = "&prod" %then %do;

然后使用%put对其进行调试,您应该包含完整的比较(双方)以使其更突出:

%put prod = "&prod";

此输出将显示等号左侧的字符串不等于右侧的字符串。问题的一部分是你在右边引用字符串,而不是在左边引用字符串。即使您的宏变量&prod包含值prod,您基本上也会测试此条件:

prod = "prod"

更好的比较是将两个字符串用引号括起来:

%if "prod" = "&prod" %then %do;

事实上,在宏语言中,双引号几乎与任何其他字符相似。所以我们可以用双引号以外的字符包装它们:

%if ###prod@@ = ###&prod@@ %then %do;

重要的是要对待它们。您甚至可以省略双引号,但我认为这有时会导致问题,因为如果字符串包含宏引用的空格或不可打印的字符,则很难调试:

%if prod = &prod %then %do;  /* LEAST FAVOURITE OPTION AS IT CAN BE HARD TO DEBUG */

希望这有帮助。