%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語句評估爲假的?如果聲明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語句評估爲假的?如果聲明SAS宏
在SAS宏語言,一切是一個字符串,那麼你的發言
%if prod = "&prod" %then %do;
永遠不會爲真;字符串督促永遠等於字符串「&刺」如果僅僅因爲一個字符串包括雙引號和其他沒有。
所以在雙方都使用雙引號或根本不使用雙引號。無論是哪種會更好:
%if "prod" = "&prod" %then %do;
%if prod = &prod %then %do;
而且,請注意,這種修復後,該語句將是「真正的」只有當你創建的宏變量督促(這四個字符)的精確值。案例事項:督促不等於PROD
。調試這樣的事情最好的辦法是把它放在一個%put
聲明,我可以看到你已經嘗試做的,但它可以變得有點棘手。 Because你的比較的說法是:
%if prod = "&prod" %then %do;
然後用%put
來調試它,你應包括在全面比較(兩側),以使它脫穎而出更多:
%put prod = "&prod";
從這裏輸出將告訴你等號左邊的字符串不等於右邊的字符串。問題的一部分是你引用右邊的字符串,而不是左邊的引用。即使你的宏變量&prod
包含的值prod
你基本上測試此條件:
prod = "prod"
更好的比較將用引號括兩個字符串,像這樣:
%if "prod" = "&prod" %then %do;
實際上在宏觀語言雙引號幾乎與任何其他字符相似。因此,我們可以用雙引號以外的字符包裝它們:
%if ###[email protected]@ = ###&[email protected]@ %then %do;
重要的是要對待它們。你甚至可以省略雙引號,雖然我認爲這有時會導致問題,因爲它使得它很難調試如果字符串包含宏引用空格和非打印字符:
%if prod = &prod %then %do; /* LEAST FAVOURITE OPTION AS IT CAN BE HARD TO DEBUG */
希望這有助於。