SAS v9.4文档列出了一个自动宏变量&sysodsescapechar
,其中包含使用ods escapechar=
分配的当前ODS转义字符。
每当我尝试使用%put
语句查看宏变量时,都会出现以下错误:
ERROR: Open code statement recursion detected.
当打开的代码错误地导致宏语句调用另一个宏语句时,会发生这种情况。
我尝试了以下所有方法:
%put &=sysodsescapechar.;
%put %nrbquote(&sysodsescapechar.);
%put %superq(sysodsescapechar);
它们都会导致同样的错误。
当我尝试使用数据步骤查看宏变量时,它似乎是空的。
data test;
esc = "&sysodsescapechar.";
put esc=;
run;
如果宏变量实际为空,为什么我会得到开放代码语句递归错误? <{1}}语句本身是有效的,所以放一个空变量应该不是问题。
非常感谢此处的任何指导。
答案 0 :(得分:2)
正在发生的事情是,逃脱字符似乎需要一个紧密的括号。例如:
%put %superq(SYSODSESCAPECHAR););
它逃脱了)
,这意味着现在你已经
%put superq(;);
在你的第一个例子中,它有点棘手,因为分号本身似乎没有被转义,所以你必须提供一个紧密的括号:
%put &SYSODSESCAPECHAR.)x;
X
例如,这有用。我不确定它是否只是关闭paren或其他可以让它停止试图逃脱的东西,但这是我唯一能说的作品。
您可以在SASHELP.VMACRO
中查看宏变量的实际值;它不是''(即使使用SYMGET,它确实会被传递到数据步骤,但它已被清楚地解析)。在该表中,它是'03'x,在角色的上半部分看起来像一个大写的L.这是“文本结束”控制字符。我怀疑在文本中使用它时(在宏变量中)编辑器中的行为只是编辑器的行为 - '03'x在许多编辑器中无法表示(如果我尝试将其粘贴到此处,例如,它不是没有显示,但确实存在,我可以退零,宽度为零)。 SAS显然能够处理'正常'的ods escapechar,但不能以同样的方式处理'03'x。