多级宏变量解析

时间:2017-03-23 13:46:36

标签: sas sas-macro

我在存储空间中有电子邮件列表,我将其包括在内,以便特定国家/地区的人员收到通知但出于演示目的,请使用一个:

我想根据变量& system:

动态选择地址
%let SEList1 = "my.email@domain.eu";

%put system.list1.;
/*system.list1, which is ok*/
%put &system.list1.;
/*SElist1, which is ok*/
%put &&system.list1.;
/*SElist1, Hmm? Shouldn't this be "my.email@domain.eu"*/


%put &&&system.list1.;
/*"my.email@domain.eu", umm... ok? */
/*Lets keep going.... */

%put &&&&system.list1.;
/*SElist1. wut?  */
%put &&&&&system.list1.;
/*"my.email@domain.eu"*/
%put &&&&&&system.list1.;
/*"my.email@domain.eu"*/
%put &&&&&&&system.list1.;
/*&"my.email@domain.eu"*/
%put &&&&&&&&system.list1.;
/*SElist1. You got to be kidding me?*/

问题:

a)为什么不&&没有决心解决,但&&&呢?

b)地球上正在发生的水平为& * 4 +

1 个答案:

答案 0 :(得分:5)

当SAS宏处理器看到两个和号&&时,它会将其解析为一个&,并设置一个标志,指示需要重新处理字符串以获得更多宏变量分辨率。

因此,&&&system.list1.被处理为&&&system.list1.,其中间值为&SElist1.。因此,在第二遍中,您将获得间接宏变量引用的值。

  

178%让SEList1 =" my.email@domain.eu" ;;
  179%让系统= SE;
  180个选项symbolgen;
  181%放置&&& system.list1。;
  符号:&&解析为&。
  SYMBOLGEN:宏变量SYSTEM解析为SE
  SYMBOLGEN:宏变量SELIST1解析为" my.email@domain.eu"   " my.email@domain.eu"

如果您只有两个&&,则中间值仅为&system.list1.,它将分为&system.list1.,因此结果应为SElist1. < / p>

您可以添加任意数量的内容并遵循此规则。例如,如果您在第一次传递后有6次,那么就像您从3开始一样,因为每对只减少到1。因此使用6会产生与使用3相同的结果,但它只需要在解析字符串时需要额外的传递。