SAS Studio - 括号影响 sysfunc 函数如何解析宏变量

问题描述 投票:0回答:1

我的代码中有一个计数器,如下所示:

%let counter = %sysfunc(countw(&&CLMNS&j.));
但是,这对于某些宏变量无法正常工作。对于包含值
variable_1
Parent_Name, Name
,计数器返回 3(应为 2)。对于包含
variable_2
Alt_Parent_Name, Alt_Name
,计数器正确返回值 2。

如果我添加一对括号,那么现在是:

%let counter = %sysfunc(countw((&&CLMNS&j.)));
,现在它会正确输出
variable_1
variable_2
的值 2。

我已阅读帮助卡但无济于事,我想弄清楚为什么会发生这种情况以及额外的括号的作用。我最困惑的是第一次结果的不一致。

sas sas-macro proc-sql sas-studio
1个回答
0
投票

也许这有帮助:

SAS 将按以下顺序对其进行分解:

%let counter = %sysfunc(countw(&&CLMNS&j.));

  1. 两个 & 符号 (
    &&
    ) 解析为一个 & 符号 (
    &
    ),并且扫描仪继续。
  2. 解析全局符号表中的
    &j.
    。例如。到
    1
  3. 然后在全局符号表中解析
    &CLMNS1
    。例如。到
    variable_1
    (必须用另一个 & 符号来解决)或只是
    Parent_Name, Name
  4. 替换输入堆栈中的值:
    • %let counter = %sysfunc(countw(Parent_Name, Name));

现在您也许可以看到出了什么问题。当编译器继续运行时,它将把

Name
理解为
<character(s)>
中的可选参数
countw

您想要的是屏蔽宏处理器的

&&CLMNS&j.
的输出。 IE。使用
%NRSTR

%let counter = %sysfunc(countw(%NRSTR(&&CLMNS&j.)));

这些资源可能与您相关:

  1. 深入了解:宏处理器到底如何工作?
  2. 与号 (&) 挑战,单、双还是更多?
  3. SAS 帮助中心:COUNTW
  4. SAS 帮助中心:%STR 和 %NRSTR 函数
© www.soinside.com 2019 - 2024. All rights reserved.