Макро разрешение - PullRequest
       44

Макро разрешение

0 голосов
/ 20 февраля 2020

У меня есть макрос, который разрешается в строку, которая содержит амперсанд, и это вызывает ошибку WARNING: Apparent symbolic reference A not resolved.

Например,

Data _NULL_;
T=%NRSTR("A&A");
call symput("test",T);
run;

%put &=test.;

Есть ли способ разрешить только один раз? Функция NR, кажется, удаляет значение всех & и предотвращает любые разрешения. Я хочу разрешить его только один раз.

Следующий пример работает, но мне нужно, чтобы он был частью шага данных, поскольку для создания строки A&A используется несколько других функций регулярных выражений.

%let Test=%NRSTR(A&A);
%put &test;

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 20 февраля 2020

Чтобы решить проблему с первым использованием, просто используйте одинарные кавычки. Это позволит вам создать макропеременную с амперсандом в ней.

data _null_;
  call symputx('test','A&A');
run;

Затем используйте некоторый код макроса для добавления кавычек макросов. Я считаю% SUPERQ () самым простым.

%let test=%superq(test);

Если вы делаете таким же образом много макропеременных на одном шаге данных, вы можете использовать функцию RESOLVE () или CALL EXECUTE () чтобы позволить вам запускать% LET сразу после создания макропеременной.

data _null_;
  set variable_list;
  call symputx(name,value);
  call execute(catx(' ','%let',name,'=%superq(',name,');'));
run;
0 голосов
/ 20 февраля 2020

На шаге DATA заключите в кавычки текстовое значение, которое отправляется в макросреду.

Чтобы не интерпретировать & как запрос разрешения, %superq символ макроса при его использовании .

Data _NULL_;
  T = 'A&A';
  call symput("test",T);
run;

%put NOTE: test macro symbol value is %superq(test);

---------- LOG ----------
21   %put NOTE: test macro symbol value is %superq(test);
NOTE: test macro symbol value is A&A
...