SAS在宏变量中存储宏引用

SAS在宏变量中存储宏引用,sas,sas-macro,Sas,Sas Macro,我想在另一个宏变量中存储宏引用列表,然后更改其中一个引用变量的内容 例如: %LET String=FirstString; %LET KeepMacroNotString=&String; %PUT &String = &KeepMacroNotString ?; %LET String=String changed; %PUT &String = &KeepMacroNotString?; 最后,我希望%PUT&KeepMacroNo

我想在另一个宏变量中存储宏引用列表,然后更改其中一个引用变量的内容

例如:

%LET String=FirstString; 
%LET KeepMacroNotString=&String; 
%PUT &String = &KeepMacroNotString ?;  


%LET String=String changed; 
%PUT &String = &KeepMacroNotString?; 
最后,我希望%PUT&KeepMacroNotString解析为“String changed”。然而,它坚持第一个任务

有什么想法吗? Thx,Lubenja

我找到了解决方案: %NRSTR函数和%UNQUOTE函数的组合可以实现以下功能:

%LET String=FirstString; 
%LET KeepMacroNotString=%NRSTR(&String); 
%PUT &String = &KeepMacroNotString ?;  

%LET String=String changed; 
%PUT &String = %UNQUOTE(&KeepMacroNotString)?; 
说明:首先必须屏蔽“&”以防止解析宏(%NRSTR())。
但是,如果要使用marco,则必须再次将其解压缩(%unquote())

使用数据步骤要容易得多

data _null_;
  call symputx('KeepMacroNotString','&String');
run;

我不会使用这种方法,但如果您不介意日志中的警告消息(我介意),理论上您可以更改语句的顺序:

WARNING: Apparent symbolic reference STRING not resolved.
 57         
 58             %LET KeepMacroNotString=&String;
 59         
 60             %LET String=FirstString;
 61             %PUT &String = &KeepMacroNotString ?;
 FirstString = FirstString ?
 62         
 63             %LET String=String changed;
 64             %PUT &String = &KeepMacroNotString?;
 String changed = String changed?
这基本上是一种丑陋的方式来完成汤姆更优雅地完成的同样的间接动作。关键点在于,宏变量KeepMacroNotString的值为&String,而不是解析值

在宏设置中,这也可以通过将默认值指定为宏变量参考来实现,例如:

 59         %macro indirect(String=
 60                 ,KeepMacroNotString=&string
 61                 );
 62           %put _local_;
 63           %put &string = &keepmacronotstring;
 64         %mend indirect;
 65         %indirect(string=Hi)
 INDIRECT KEEPMACRONOTSTRING &string
 INDIRECT STRING Hi
 Hi = Hi

是的,非常简单,因为您可以使用宏&KeepMacroNotString 1)而不使用unquote函数,2)而无需重新设计它。谢谢!卢本亚