2014-02-07 93 views
1
%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宏

回答

4

在SAS宏語言,一切是一個字符串,那麼你的發言

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

永遠不會爲真;字符串督促永遠等於字符串「&刺」如果僅僅因爲一個字符串包括雙引號和其他沒有。

所以在雙方都使用雙引號或根本不使用雙引號。無論是哪種會更好:

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

而且,請注意,這種修復後,該語句將是「真正的」只有當你創建的宏變量督促(這四個字符)的精確值。案例事項:督促不等於PROD

1

調試這樣的事情最好的辦法是把它放在一個%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 */ 

希望這有助於。