多级宏变量解析

Multiple levels of macro variables resolve

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

我想动态 select 地址取决于变量 &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+

的水平到底发生了什么

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

所以 &&&system.list1. 被处理为 &&&system.list1. ,这给你一个中间值 &SElist1.。因此,在第二遍中,您将获得间接宏变量引用的值。

178 %let SEList1 = "my.email@domain.eu";
179 %let system = SE ;
180 options symbolgen ;
181 %put &&&system.list1.;
SYMBOLGEN: && resolves to &.
SYMBOLGEN: Macro variable SYSTEM resolves to SE
SYMBOLGEN: Macro variable SELIST1 resolves to "my.email@domain.eu" "my.email@domain.eu"

如果你只有两个 && 那么中间值就是 &system.list1. 它将分裂成 &system.list1. 所以结果应该是 SElist1.

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