SAS ODS转义字符宏变量错误

SAS ODS escape character macro variable error

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;

如果宏变量实际为空,为什么会出现开放代码语句递归错误? %put 语句本身是有效的,因此放置一个空变量应该不是问题。

如有任何指导,我们将不胜感激。

发生的事情是转义字符似乎需要一个右括号。例如:

%put %superq(SYSODSESCAPECHAR););

;

它转义了 ) ,这意味着现在你有

%put superq(;);

在你的第一个例子中,它有点棘手,因为分号本身似乎没有被转义,所以你必须提供一个右括号:

%put &SYSODSESCAPECHAR.)x;

x

例如,这行得通。我不确定它是否只是 close paren 或其他也可以让它停止尝试逃跑的东西,但这是我唯一能告诉你的作品。

可以看看SASHELP.VMACRO中宏变量的实际值;它不是“”(即使使用 SYMGET,这确实是传递给数据步骤的内容,但它已被清楚地解析)。在那个 table 中它是 '03'x,它看起来像字符上半部分的大写 L。那就是 "End of Text" 控制字符。我怀疑在文本中(在宏变量中)使用它时编辑器中的行为只是编辑器的一种行为 - '03'x 在许多编辑器上不代表 table(如果我尝试将其粘贴到此处,例如,它没有显示,但确实存在,我可以用零宽度退格)。 SAS 显然能够处理 'normal' ods escapechar,但不能以相同的方式处理 '03'x。