sas MACRO&符号

时间:2014-04-07 04:51:55

标签: sas sas-macro ampersand

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

%put &test;
%put &&test;
%put &&&test;
%put &&&&test;
%put &&&&&test;

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

1 个答案:

答案 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 - >二。奇数对意味着我们再得到一组结算。

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

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

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