引用一个已经定义的宏变量
Referring to a macro variable already defined
我在查看 SAS 代码时发现了以下引用宏变量的方法。
- &variable_name .
- &variable_name
我知道第一种引用方式是我们在 sas 中引用定义的宏变量的正常方式。
但是,请您解释一下第二种方式(宏变量名后没有句点)与第一种方式有何不同
这是引用变量的快捷方式。但是,它在连接输出时有所不同:
%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.
。因为很清楚变量在哪里结束。
当您引用宏变量时,& 符号表示宏变量引用开始。宏处理器还需要判断宏变量引用的结束。
在大多数情况下,宏引用以白色 space 或分号结束。
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,Hello 和 World 之间没有 space:
46 %put &xWorld;
WARNING: Apparent symbolic reference XWORLD not resolved.
&xWorld
那没用。宏处理器看到了对名为 xWorld 的宏变量的引用,但没有这样的宏变量。所以我们需要一种方法来告诉宏处理器宏变量引用在x之后结束。我们可以在 x 后面加一个句点,表示 "macro variable reference ends here."
47 %put &x.World;
HelloWorld
请注意,重要的是,我们键入的句点不会显示在写入日志的文本中。宏处理器"eats"使用它作为宏变量引用结束的时期
这意味着如果您希望在宏变量引用之后有一个句点,则必须键入两个句点。第一个被宏处理器吃掉了。通常的例子是一个 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.
有些人喜欢在宏变量引用之后始终使用句号作为一种编码风格。就个人而言,我只在需要指定宏变量引用结束时才使用句点。
我在查看 SAS 代码时发现了以下引用宏变量的方法。
- &variable_name .
- &variable_name
我知道第一种引用方式是我们在 sas 中引用定义的宏变量的正常方式。
但是,请您解释一下第二种方式(宏变量名后没有句点)与第一种方式有何不同
这是引用变量的快捷方式。但是,它在连接输出时有所不同:
%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.
。因为很清楚变量在哪里结束。
当您引用宏变量时,& 符号表示宏变量引用开始。宏处理器还需要判断宏变量引用的结束。
在大多数情况下,宏引用以白色 space 或分号结束。
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,Hello 和 World 之间没有 space:
46 %put &xWorld;
WARNING: Apparent symbolic reference XWORLD not resolved.
&xWorld
那没用。宏处理器看到了对名为 xWorld 的宏变量的引用,但没有这样的宏变量。所以我们需要一种方法来告诉宏处理器宏变量引用在x之后结束。我们可以在 x 后面加一个句点,表示 "macro variable reference ends here."
47 %put &x.World;
HelloWorld
请注意,重要的是,我们键入的句点不会显示在写入日志的文本中。宏处理器"eats"使用它作为宏变量引用结束的时期
这意味着如果您希望在宏变量引用之后有一个句点,则必须键入两个句点。第一个被宏处理器吃掉了。通常的例子是一个 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.
有些人喜欢在宏变量引用之后始终使用句号作为一种编码风格。就个人而言,我只在需要指定宏变量引用结束时才使用句点。