С одним набором амперсандов получается довольно скучно; после единицы нечетное количество амперсандов приводит к разрешению дважды, четное количество амперсандов разрешается один раз. Таким образом, вы используете 1 амперсанд для разрешения один раз и 3 амперсанда для разрешения дважды, если только у вас нет акций компании, которая владеет правами на амперсанд.
Более интересен следующий тест, который показывает, почему четное число амперсандов имеет значение:
%let test = one;
%let testtwo = one;
%let one = two;
%let two=three;
%put &test&one;
%put &&test&one;
%put &&&test&one;
%put &&&&test&one;
%put &&&&&test&one;
%put &&&&&&test&one;
По сути, при каждом проходе SAS выполняет следующие действия:
- Преобразуйте любой текст с одним амперсандом плюс в ссылку на переменную макроса.
- Любые пары амперсандов преобразуйте в один амперсанд.
Это делается одновременно и итеративно до тех пор, пока не исчезнут все амперсанды, и каждый результат сохраняется для следующей итерации и не влияет на текущую итерацию. Итак, &test&one
становится onetwo
, потому что &test
-> один и &one
-> два. Шаги для остальных:
&&test&one
-> &testtwo
-> one
. &&|test|&one
. Двойное &&
перед тестом становится &
, тест остается, а &one
разрешается в two
. Это оставляет &testtwo
для второго прохода, который разрешается в one
.
&&&test&one
-> &onetwo
-> не разрешается. &&|&test|&one
-> &|one|two
-> ДНР.
&&&&test&one
-> &&testtwo
-> &testtwo
-> один. &&|&&|test|&one
-> &&|testtwo
-> &testtwo
-> один. Каждая из двух пар разрешается до единицы, образуя одну пару, которая затем разрешается до единицы, что оставляет &testtwo
для разрешения.
&&&&&test&one
похож на регистр с тремя амперсандами, но с одной дополнительной парой.
&&&&&&test&one
разрешается в &&&testtwo
разрешается в &one
разрешается в два. &&|&&|&&|test|&one
-> &&|&testtwo
-> &one
-> два. Нечетное количество пар означает, что мы получаем еще один набор разрешений.
В конце концов, что вам нужно помнить:
- 1 амперсанд разрешает макропеременную один раз и все.
- 2 амперсанда полезны для составных макропеременных, т. е. префикс плюс суффикс, управляемый макросом (
&&prefix&suffix
).
- 3 амперсанда полезны для углубления на два в разрешении одной макропеременной (
&&&var
-> &var2
-> var3
).
- 6 амперсандов полезны для разрешения составной макропеременной с двумя глубинами (т. е. объединения 2 и 3) ([
&prefix=var
, &suffix=2
] &&&&&&prefix&suffix
-> &&&var2
-> &var3
-> 4
).
Кроме того, 4 или более (кроме 6) полезны только для особенно сложных комбинаций; дополнительные уровни будут использоваться для задержки разрешения до определенного времени.
07.04.2014
.
как разделитель, обозначающий конец ссылки на переменную макроса. Это означает, что&&&&test.&one
->&&test.two
->&test.two
->onetwo
. Вы также можете проверить журнал для полезного объяснения 11.12.2017