Sas 为什么';t%是否允许创建本地宏变量?

Sas 为什么';t%是否允许创建本地宏变量?,sas,Sas,我一直认为%let如果在%macro…%中使用,则会创建一个local变量修理 但当我运行此代码时,SAS日志显示GLOBAL TESTVAR value1 %let testVar = value2; %macro test; %let testVar = value1; %mend; %test %put _all_; 因此,我无法理解为什么全局变量testVar的值更改为value1。我希望它保持不变value2。%let语句在%macro中应该只影响本地符号表 : 当

我一直认为
%let
如果在
%macro…%中使用,则会创建一个
local
变量修理

但当我运行此代码时,SAS日志显示
GLOBAL TESTVAR value1

%let testVar = value2; 
%macro test; 
%let testVar = value1; 
%mend;   

%test 

%put _all_;
因此,我无法理解为什么全局变量
testVar
的值更改为
value1
。我希望它保持不变
value2
%let
语句在
%macro
中应该只影响本地符号表

:

当宏处理器执行可以创建宏变量的宏程序语句时,如果没有相同名称的宏变量可用,宏处理器将在本地符号表中创建该变量


关键是“如果没有具有相同名称的宏变量可用”,在本例中,具有相同名称的宏变量可用,因为您已经将testVar定义为全局变量

您可以为其指定一个不与全局共享的名称,也可以显式地将其声明为本地名称:

%let testVar = value2; 
%macro test; 
    %local testVar;
    %let testVar = value1; 
%mend;   

%test 

谢谢,我现在明白了。我对SAS示例感到困惑:
%let new=inventry;%宏名称2;%让new=report
@Alex您应该始终将宏中的变量显式声明为本地变量(如果您希望它们是本地变量)。如果您的宏恰好调用了其他宏(或正被另一个宏调用),否则可能会导致调试代码困难。