sas MACRO&符号

zhu*_*oer 9 sas ampersand sas-macro

%let test = one;
%let one = two;

%put &test;
%put &&test;
%put &&&test;
%put &&&&test;
%put &&&&&test;
Run Code Online (Sandbox Code Playgroud)

好.我完全被这些&符号击败了.我不明白他们为什么在宏变量之前需要那么多的&符号.有没有什么技巧可以掌握&符号的用法?顺便说一下,五个结果相应的是什么?

Joe*_*Joe 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;
Run Code Online (Sandbox Code Playgroud)

基本上,每次通过,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- >两个.奇数对意味着我们再得到一组结算.

在一天结束时,您需要记住:

  • 1个&符号解析宏变量一次,就是这样.
  • 2个&符号对复合宏变量很有用,即前缀加上宏驱动的后缀(&&prefix&suffix).
  • 3个&符号可用于深入解析单个宏变量(&&&var- > &var2- > var3).
  • 6个&符号可用于解析双深度复合宏变量(即组合2和3)([ &prefix=var,&suffix=2] &&&&&&prefix&suffix- > &&&var2- > &var3- > 4).

除此之外,4个或更多(除了6个)仅适用于特别复杂的组合; 额外的水平将用于延迟解决直到特定时间.