%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?
答案 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 */
希望这有帮助。