在哈希声明中解析宏变量?

时间:2014-03-10 20:40:20

标签: sas sas-macro

遇到一些不寻常的事情。我觉得这可能是我的一个愚蠢的错误,但对于我的生活,我无法弄清楚它可能是什么。

以下工作正常:

declare hash hash&foo1.&foo2.&foo3.&foo4.();
...

以下不起作用:

declare hash hash%do bar = 1 %to &nvars.;&&foo&bar..%end;();
...

它们似乎都解析为

declare hash hash1111();

但是后者抛出语法错误。有什么想法吗?具体错误是:

Line generated by the macro variable "FOO1".
1
Error 22-322: Syntax error, expecting one of the following: a name, (, ;.
...
declare hash hash1111();
NOTE: Line generated by the macro variable "FOO4".
hash1111

1 个答案:

答案 0 :(得分:2)

如果我想生成代码片段,我会在使用片段之前执行此操作 以下代码仅供参考:

%macro test;
%global foobar;
%let foobar = ;
%let foo1 = 1;
%let foo2 = 1;
%let foo3 = 1;
%let foo4 = 1;

%let foobar = &foo1.;
%do bar = 2 %to 4;
  %let foobar = %sysfunc(cats(&foobar., &&foo&bar..));
  %put *&foobar.*;
%end;
%mend;
%test;

现在你可以随时随地使用macrovariable foobar。例如

declare hash hash&foobar.();  

后续研究我终于在http://www2.sas.com/proceedings/sugi28/011-28.pdf

中找到了解决方案

您需要取消引用宏循环。我不知道为什么,但以下代码正在运行:

%macro test3();  
  %global foobar;  
  %let foobar =;  
  %let foo1 = 1;  
  %let foo2 = 1;
  %let foo3 = 1;
  %let foo4 = 1;

  data test2;
    declare hash hash%unquote(%do bar = 1 %to 4;&&foo&bar..%end;)();
  run;
%mend;  
%test3;

SUGI论文的以下声明导致解决方案: “无论如何,较旧的文件给出了简单的规则:
如果mprint看起来不错并且SAS编译器不理解它,那么尝试%UNQUOTE。“