在SAS中引用括号中的括号

时间:2016-12-06 23:49:13

标签: sas

我有一个SAS程序可以动态生成另一个SAS程序(不要问为什么),如下所示:

data _null_;file="myFile.sas";x = "%nrstr(my sas code)";put x;run;

我有一个边缘情况,我的代码看起来像这样:

"%nrstr(%myMacro(something,)" || "&macroVariable);";

问题是第一个)正在关闭%myMacro,即使我真的希望它关闭%nrstr,因此打印%myMacro(something,*valueOfMacroVariable);而不是打印%myMacro(something,)*valueOfMacroVariable);哪个不行。

问题是在%nrstr内部没有解析宏变量,但是如果我不用%nrstr包裹它,它会在put时评估,而不是打印到文件。我想要的是x = "%myMacro(something,&macroVariable);",但就像我说这不会打印到新程序,这只是运行我不想要的宏。

我有没有办法逃脱(中的%nrstr,以便将其视为任意字符,并且不会尝试将其与相应的)配对可以使用)来关闭%nrstr吗?

亲切的问候

2 个答案:

答案 0 :(得分:3)

您只需要在引用的字符串周围引用%NRTSTR()宏引用,在本例中为宏名称。另外,除非您想扩展宏变量或宏调用,否则不要使用双引号。因此,如果您不想要稍后执行宏调用或宏变量引用(也许您正在使用CALL EXECUTE将它们推送到堆栈中),那么您可以像这样构建字符串。

'%nrstr(%myMacro)' || '(something,' || '%nrstr(&macroVariable)' || ');' 

如果您确实希望宏引用立即运行,而不是宏调用那么您可能需要这样的内容:

'%nrstr(%myMacro)' || '(something,' || "&macroVariable" || ');' 

答案 1 :(得分:1)

%是你如何逃避宏引用函数内的事情。

所以这会奏效:

data _null_;
  x="%nrstr(%myMacro%(something,)" || '&macroVariable);';
  put x=;
run;

注意括号前的%

如果你是从数据构建的,那么(正如你所希望的那样)可能会有更好的选择,具体取决于你是如何做的。