Сначала немного по терминологии. Макропроцессор SAS - это инструмент, который может манипулировать текстом и передавать результат в реальную систему SAS для интерпретации. Эта строка кода использует оператор макропроцессора, но это не полное определение макроса. Фактически, начиная с SAS 9.4 (я думаю, возможно, с техническим выпуском 9.4m4?), Вы могли бы использовать оператор типа %if/%then/%do
в обычной программе SAS, даже не определяя действительный макрос вообще.
Итак, у вас есть макрос %if
. Общая форма:
%if condition %then statement ;
Поскольку оператор после части %then
является оператором макроса %do
, вашей программе понадобится оператор %end;
, чтобы отметить конец блока для выполнения, когда условие выполнено.
Давайте посмотрим на условие, которое проверяется в вашем %if
утверждении.
%sysfunc(prxmatch(/^(E0349646)$/i, &SYSUSERID.)) ne 0
Таким образом, используется макрос-функция %sysfunc()
, позволяющая вызывать функцию SAS prxmatch()
в коде макроса. Это часть группы функций, которые реализуют регулярные выражения Perl. Вы также ссылаетесь на макропеременную с именем SYSUSERID
. Эта конкретная макропеременная - это та, которую SAS создает автоматически, чтобы содержать ИД пользователя, который запускает программу SAS. Регулярное выражение, используемое в вызове функции prxmatch()
, проверяет, равно ли значение E0349646
, игнорируя регистр. Результатом будет позиция первого найденного местоположения в искомой строке. Если он не найден, он вернет 0. (SAS, как и люди, использует индексы, начиная с единицы, а не с нуля.).
Обратите внимание, что включение ^
и $
в регулярное выражение означает, что оно должно соответствовать полной строке. Итак, вы проверяете, работает ли E0349646.
Было бы гораздо проще проверить это напрямую, без необходимости использования регулярного выражения или необходимости использования немакро-вызовов функций.
%if %upcase(&sysuserid)=E0349646 %then %do;