%let test = one;
%let one = two;
%put &test;
%put &&test;
%put &&&test;
%put &&&&test;
%put &&&&&test;
好。我完全被这些&符号击败了。我不明白为什么他们在宏变量之前需要那么多的&符号。有没有什么技巧可以掌握&符号的用法?顺便说一句,相应的五个结果是什么?
答案 0 :(得分:14)
只需一套&符号,你得到的就是很无聊;在一个之后,奇数个&符导致两次解析,偶数个&符号解析一次。所以你使用1个&符号来解决一次和3个&符号来解决两次,除非你拥有拥有&符号权利的公司的股票。
更有趣的是以下测试,它显示了为什么偶数个&符有价值的原因:
%let test = one;
%let testtwo = one;
%let one = two;
%let two=three;
%put &test&one;
%put &&test&one;
%put &&&test&one;
%put &&&&test&one;
%put &&&&&test&one;
%put &&&&&&test&one;
基本上,每次通过,SAS都会执行以下操作:
这些是同时迭代完成的,直到所有的&符号消失,并且每个结果都保留用于下一次迭代,并且不影响当前的迭代。因此,&test&one
变为onetwo
,因为&test
- >一个和&one
- >二。剩下的步骤:
&&test&one
- > &testtwo
- > one
。 &&|test|&one
。测试前的双&&
变为&
,测试仍然存在,&one
解析为two
。这会使&testtwo
为第二次传递,并解析为one
。&&&test&one
- > &onetwo
- >不解决。 &&|&test|&one
- > &|one|two
- > DNR。 &&&&test&one
- > &&testtwo
- > &testtwo
- >一。 &&|&&|test|&one
- > &&|testtwo
- > &testtwo
- >一。两对每个分解为一个,形成一对,然后解析为一对,留下&testtwo
来解析。&&&&&test&one
类似于三个&符号,但只有一对。&&&&&&test&one
解析为&&&testtwo
解析为&one
解析为两个。 &&|&&|&&|test|&one
- > &&|&testtwo
- > &one
- >二。奇数对意味着我们再得到一组结算。在一天结束时,您需要记住:
&&prefix&suffix
)。&&&var
- > &var2
- > var3
)。&prefix=var
,&suffix=2
] &&&&&&prefix&suffix
- > {{1} } - > &&&var2
- > &var3
)。除此之外,4个或更多(6个除外)仅适用于特别复杂的组合;额外的水平将用于延迟解决直到特定时间。