我在存储中有电子邮件列表,我将其包含在内,以便特定国家的人员收到通知.但出于演示目的,请使用一个:
我想根据变量和系统动态选择地址:
%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?*/
Run Code Online (Sandbox Code Playgroud)
题:
a)为什么&&不能解决,但&&&会解决?
b)地球上发生了什么&*4 +的水平
当SAS宏处理器看到两个&符时,&&它会将其解析为一个&并设置一个标志,指示它需要重新处理字符串以获得更多的宏变量分辨率.
因此&&&system.list1.得到处理&&,&system.并list1.给你一个中间值&SElist1..因此,在第二遍中,您将获得间接宏变量引用的值.
178%让SEList1 ="my.email@domain.eu";
179%让system = SE;
180个选项符号;
181%放了&&& system.list1.;
SYMBOLGEN:&&解析为&.
SYMBOLGEN:宏变量SYSTEM解析为SE
SYMBOLGEN:宏变量SELIST1解析为"my.email@domain.eu""my.email@domain.eu"
如果你只有两个,&&那么中间值就是&system.list1.分裂成的&system.,list1.所以结果应该是SElist1.
您可以根据需要添加任意数量,并遵循此规则.例如,如果您在第一次传递后有6次,那么就像您从3开始一样,因为每对只减少到1.因此,使用6会产生与使用3相同的结果,但在解析字符串时只需要额外的传递.