多级宏变量解析
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 相同的结果,但它只需要在解析字符串时额外传递一次。
我在存储中有电子邮件列表,我将其包含在内以便特定国家/地区的人收到通知。但出于演示目的,让我们使用一个:
我想动态 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 相同的结果,但它只需要在解析字符串时额外传递一次。