| %put %str(% %% %%% ); %put %nrstr(% %% %%% %%%%); %put %quote(% %% %%% %%); %put %nrquote(% %% %%% ); %put %bquote(% %% %%%); %put %nrbquote(% %% %%%%); |
| %macro test; %local mvar1 mvar2 mvar3 mvar4 mvar5 mvar6 mvar7 mvar8; %let mvar1=a,b,c; %let mvar2=%str( a,b,c ); %let mvar3=%str( &mvar1 ); %let mvar4=%unquote( &mvar2 ); %let mvar5=%quote( a,b,c ); %let mvar6=%quote(&mvar1); %let mvar7=%superq(mvar1); %let mvar8=%superq( mvar1 ); %put _local_; %put mvar1: *&mvar1*; %put mvar2: *&mvar2*; %put mvar3: *&mvar3*; %put mvar4: *&mvar4*; %put mvar5: *&mvar5*; %put mvar6: *&mvar6*; %put mvar7: *&mvar7*; %put mvar8: *&mvar8*; %if &mvar1 eq &mvar2 %then %put A: mvar1 equals to mvar2; %if &mvar1 eq &mvar3 %then %put B: mvar1 equals to mvar3; %if &mvar1 eq &mvar4 %then %put C: mvar1 equals to mvar4; %if &mvar1 eq &mvar5 %then %put D: mvar1 equals to mvar5; %if &mvar1 eq &mvar6 %then %put E: mvar1 equals to mvar6; %if &mvar1 eq &mvar7 %then %put F: mvar1 equals to mvar7; %if &mvar1 eq &mvar8 %then %put G: mvar1 equals to mvar8; %if &mvar1 eq %qleft(&mvar5) %then %put H: mvar1 equals to %nrstr(%qleft%()mvar5%str(%)); %mend; %test LOG: TEST MVAR8 _a_b_c_ TEST MVAR5 _ a_b_c _ TEST MVAR4 a,b,c TEST MVAR7 _a_b_c_ TEST MVAR6 _a_b_c_ TEST MVAR1 a,b,c TEST MVAR3 _ a,b,c _ TEST MVAR2 _ a_b_c _ mvar1: *a,b,c* mvar2: * a,b,c * mvar3: * a,b,c * mvar4: *a,b,c* mvar5: * a,b,c * mvar6: *a,b,c* mvar7: *a,b,c* mvar8: *a,b,c* A: mvar1 equals to mvar2 B: mvar1 equals to mvar3 C: mvar1 equals to mvar4 E: mvar1 equals to mvar6 F: mvar1 equals to mvar7 G: mvar1 equals to mvar8 H: mvar1 equals to %qleft(mvar5) |
| options mlogic; %macro quotedval(val); %put &val; %mend; %quotedval(a;b;c) %quotedval(%str(a;b;c)) LOG: 31 %quotedval(a;b;c) MLOGIC(QUOTEDVAL): Beginning execution. MLOGIC(QUOTEDVAL): Parameter VAL has value a;b;c MLOGIC(QUOTEDVAL): %PUT &val a;b;c MLOGIC(QUOTEDVAL): Ending execution. 32 %quotedval(%str(a;b;c)) MLOGIC(QUOTEDVAL): Beginning execution. MLOGIC(QUOTEDVAL): Parameter VAL has value _a_b_c_ MLOGIC(QUOTEDVAL): %PUT &val a;b;c MLOGIC(QUOTEDVAL): Ending execution |
| options symbolgen; %let x=%quote(abcde); %put &x; LOG: SYMBOLGEN: Macro variable X resolves to abcde SYMBOLGEN: Some characters in the above value which were subject to macro quoting have been unquoted for printing. abcde |

| %let a=b; %let b=q; %put %nrbquote(&&&a); %put %nrstr(&&&a); %symdel G/nowarn; * two warnings: one from %LET and one from %PUT; %let company1=P&G; %put company1: &company1; * one warning: from %LET; %let company2=%nrbquote(P&G); %put company2: &company2; * no warning; %let company3=%nrstr(P&G); %put company3: &company3; |
| %symdel a b c d e/nowarn; %let a=&b; %let b=&c; %let c=d; %let d=e; %put 1: %str(&a); %put 2: %nrstr(&a); %put 3: %nrquote(&a); %put 4: %superq(a); %put 5: %superq(&a); %symdel abc/nowarn; %superq(abc); |
| %macro mvar; a %mend; %macro putmvar; %let %mvar=aaaa; %put 1. &a; %put 2. &%mvar; %put 3. %unquote(&%mvar); %put 4. %unquote(%nrstr(&)%mvar); %put 5. %unquote(%nrstr(&%mvar)); %put 6. %unquote(%nrstr(&))%mvar; %put 7. %unquote(%nrstr(&))a; %mend; %putmvar lOG: 1. aaaa 2. &a 3. &a 4. aaaa 5. &a 6. &a 7. aaaa |
| data test; do num=.,1,2; output; end; run; %let mvar=%str(case num when . then "Missing" when 1 then "One" when 2 then "Two" else " " end as char); proc sql; create table test1 as select distinct num,&mvar from test; quit; |
| %let mvar=%str(case num when %str(.) then "Missing" when 1 then "One" when 2 then "Two" else " " end as char); %let mvar=%str(case num when 1 then "One" when 2 then "Two" else "Missing " end as char); %let mvar=%quote(case num when . then "Missing" when 1 then "One" when 2 then "Two" else " " end as char); |
木叶知秋 发表于 2015-11-15 14:28
不明白mvar1和mvar2为什么相等,mvar2前面不是有空格吗?
%let mvar1=a,b,c;
%let mvar2=%str( a,b,c );
扫码加好友,拉您进群



收藏
