宏分辨率

Macro resolution

我有一个宏可以解析为包含一个 & 符号的字符串,这会导致错误 WARNING: Apparent symbolic reference A not resolved

例如

Data _NULL_;
T=%NRSTR("A&A");
call symput("test",T);
run;

%put &=test.;

有没有办法只解析一次? NR 函数似乎删除了所有 & 的含义并阻止了任何解析。我只想解决一次。

以下示例有效,但我需要它成为数据步骤的一部分,因为还有其他几个正则表达式函数用于创建 A&A 字符串。

%let Test=%NRSTR(A&A);
%put &test;

有什么想法吗?

在 DATA 步中单引号发送到宏环境的文本值。

为了防止&被解析为解析请求,使用时%superq宏符号

Data _NULL_;
  T = 'A&A';
  call symput("test",T);
run;

%put NOTE: test macro symbol value is %superq(test);

---------- LOG ----------
21   %put NOTE: test macro symbol value is %superq(test);
NOTE: test macro symbol value is A&A

要解决第一次使用的问题,只需使用单引号。这将允许您创建带有符号的宏变量。

data _null_;
  call symputx('test','A&A');
run;

然后使用一些宏代码来添加宏引用。我发现 %SUPERQ() 最简单。

%let test=%superq(test);

如果您在同一个数据步骤中以这种方式创建大量宏变量,您可能需要使用 RESOLVE() 或 CALL EXECUTE() 函数来让您 运行 %LET 正确创建宏变量后。

data _null_;
  set variable_list;
  call symputx(name,value);
  call execute(catx(' ','%let',name,'=%superq(',name,');'));
run;