我有一个SAS程序可以动态生成另一个SAS程序(不要问为什么),如下所示:
data _null_;file="myFile.sas";x = "%nrstr(my sas code)";put x;run;
我有一个边缘情况,我的代码看起来像这样:
"%nrstr(%myMacro(something,)" || "¯oVariable);";
问题是第一个)
正在关闭%myMacro
,即使我真的希望它关闭%nrstr
,因此打印%myMacro(something,*valueOfMacroVariable);
而不是打印%myMacro(something,)*valueOfMacroVariable);
哪个不行。
问题是在%nrstr
内部没有解析宏变量,但是如果我不用%nrstr
包裹它,它会在put
时评估,而不是打印到文件。我想要的是x = "%myMacro(something,¯oVariable);"
,但就像我说这不会打印到新程序,这只是运行我不想要的宏。
我有没有办法逃脱(
中的%nrstr
,以便将其视为任意字符,并且不会尝试将其与相应的)
配对可以使用)
来关闭%nrstr
吗?
亲切的问候
答案 0 :(得分:3)
您只需要在引用的字符串周围引用%NRTSTR()
宏引用,在本例中为宏名称。另外,除非您想扩展宏变量或宏调用,否则不要使用双引号。因此,如果您不想要稍后执行宏调用或宏变量引用(也许您正在使用CALL EXECUTE将它们推送到堆栈中),那么您可以像这样构建字符串。
'%nrstr(%myMacro)' || '(something,' || '%nrstr(¯oVariable)' || ');'
如果您确实希望宏引用立即运行,而不是宏调用那么您可能需要这样的内容:
'%nrstr(%myMacro)' || '(something,' || "¯oVariable" || ');'
答案 1 :(得分:1)
%
是你如何逃避宏引用函数内的事情。
所以这会奏效:
data _null_;
x="%nrstr(%myMacro%(something,)" || '¯oVariable);';
put x=;
run;
注意括号前的%
。
如果你是从数据构建的,那么(正如你所希望的那样)可能会有更好的选择,具体取决于你是如何做的。