2017-07-03 83 views
2

我正在浏览SAS代码,发现引用宏变量的下列方法。引用已定义的宏变量

  1. & 变量名
  2. & 变量名

我知道引用的第一种方式是我们如何指的是SAS定义的宏变量的正常方式。

但是,请你解释一下如何做第二种方式(不包括宏变量名后段)是从第一种方式

+0

注意这些是宏变量引用。要引用一个变量,你只需使用它的名字。 – Tom

回答

1

这是引用变量的短期方式不同。但是它的确与众不同串联输出时:

%let var = My name ; 

%put &var.is Paul; 
// Output: My name is Paul. 

%put &varis Paul; 
// Output: WARNING: Apparent symbolic reference VARIS not resolved. 
// &varis Paul 

另一个例子,你肯定需要一个.

%let lib = sashelp; 
data temp; 
    set &lib..class; 
run; 

我会建议始终使用变种&variable.。因为它很清楚变量的结束位置。

+0

非常感谢@zuluk。我试图通过互联网搜索,但无法找到这个区别 – ethan

+0

您需要使用术语“宏变量周期”进行搜索,只搜索“变量”将不会返回任何内容,因为变量与宏变量不同。 – Reeza

3

当您引用宏变量时,&符号表示宏变量引用正在开始。宏处理器还需要确定宏变量引用的结束。

在大多数情况下,宏引用以空格或分号结尾。

38 %let x=Hello; 
39 
40 %put &x; *semicolon ends the reference; 
Hello 
41 
42 %put &x World; *white space ends the reference; 
Hello World 

宏变量名可以由字母,数字和下划线组成。任何不能成为宏变量一部分的符号都会结束引用。例如,一个问号:

44 %put &x?; *Question mark ends the reference; 
Hello? 

现在,假设你想生成字符串的HelloWorld,有你好与世界之间没有空格:

46 %put &xWorld; 
WARNING: Apparent symbolic reference XWORLD not resolved. 
&xWorld 

这没有奏效。宏处理器看到一个名为xWorld的宏变量的引用,并且没有这样的宏变量。所以我们需要一种方法告诉宏处理器宏变量引用在x之后结束。我们可以在x之后添加一个句点,以表示“宏变量引用在此结束”。

47 %put &x.World; 
HelloWorld 

请注意,重要的是,我们键入的时间段并未显示在写入日志的文本中。宏处理器“吃”它使用它作为宏变量引用的结束的时间段。

这意味着,如果您希望在宏变量引用之后有一段时间,则必须键入两个句点。第一个被宏处理器吃掉。通常的例子是使用libref:

48 %let mylib=sashelp; 
49 
50 proc print data=&mylib.class;run; 
ERROR: File WORK.SASHELPCLASS.DATA does not exist. 

NOTE: The SAS System stopped processing this step because of errors. 
51 
52 proc print data=&mylib..class;run; 

NOTE: There were 19 observations read from the data set SASHELP.CLASS. 

有些人喜欢在宏变量引用之后总是使用句点作为编码风格。就我个人而言,我只使用需要指定宏变量引用结束的时间段。