|
板凳
楼主 |
发表于 2003-11-3 11:14:51
|
只看该作者
sasprog问的是一个好问题。这两种方法在宏的应用中非常常见。
bowl说的非常有道理:“赋值和取值的不同”
1/ %let语句是global语句,在除DATATLINES外的任何地方可以出现,而在SAS BASE 中call sysput语句只能在data步中。另外call sysput也可出现在SCL。
2/ %let只是单次赋值(Creates a macro variable and assigns it a value);而call sysput可以灵活得获取data中变量值生成(多个)宏变量,当然也可以单个赋值(Assigns (a) value/s produced in a DATA step to (a) macro variables)。
如下面可生成宏变量POS1, POS2, POS3:
data team2;
input position : $12. player $12.;
call symput('POS'||left(_n_), position);
cards;
shortstp Ann
pitcher Tom
frstbase Bill
;
run;
3/ 两者对结尾处的blank的处理也有所不同:
data _null_;
call symput('TEST', 'SAS ');
run;
%PUT **&TEST**; *retain trailing blank;
data _null_;
call symput('TEST_SYMPUT', "&TEST");
;
run;
%LET TEST_LET =&TEST;
%put **&TEST_SYMPUT**;
%put **&TEST_LET**;
结果
8 %put **&TEST_SYMPUT**;
**SAS **
9 %put **&TEST_LET**;
**SAS**
4/ 两者产生的宏变量都是全局宏变量,这点和PROC SQL SELECT INTO不同。
5/ call symput是在DATA步完成后才赋值的,这点需要小心。
5/ 可能还有其它差别,请补充。
与call symput对应的引用宏变量的方法是call symget,类似。 |
|