Hello, I am reading about the %upcase function of the Advanced Prep Guide 4e pg 308
%let a=begin; %let b=%nrstr(&a);
%put UPCASE produces: %upcase(&a); %put UPCASE produces: %upcase(&b);
running the code produces
I think I understand why %upcase(&a) would resolves to "BEGIN". The logic I think should be something like this
%upcase(&a) → %upcase(begin) → BEGIN
But I don't understand why %upcase(&b) is not getting "BEGIN" as well.
%upcase(&b) becomes %upcase(%nrstr(&a)) as it refers to &b.
%nrstr(&a) masks the "&" trigger, so it becomes just &a.
so it becomes %upcase(&a), which comes %upcase(begin) which should become BEGIN
%upcase(&b) → %upcase(%nrstr(&a)) → %upcase(&a) → %upcase(begin)
→ BEGIN
I don't understand why %upcase(&b) resolves to lowercase "begin".
thanks in advance.
It does not matter what case you use when referring to a macro variable. So &A and &a both reference the same macro variable named A.
Because the value of B is macro quoted the %UPCASE() function just converted the string &a to the string &A. But since you used %UPCASE() instead of %QUPCASE() the macro quoting was removed so the reverence to A is resolved by the %PUT statement.
@Tom wrote:
It does not matter what case you use when referring to a macro variable. So &A and &a both reference the same macro variable named A.
Because the value of B is macro quoted the %UPCASE() function just converted the string &a to the string &A.
Okay, is what your saying this?
%upcase(&b) → %upcase(%nrstr(&a)) → %upcase(&a) → %upcase(&A)→ being
if that is true, then why the first macro reference %upcase(&a) resolved to "BEGIN"?
While the second macro variable reference %upcase(&b) becomes %upcase(&a) resolves to "begin"?
should they have the the same result as %upcase(&b) becomes exact %upcase(&a) mid step?
The %NRSTR() delays the resolution of the macro variable reference.
So %UPCASE(&a) first resolves the &a to being. Then it does the %UPCASE() on the string being to get BEING.
But %UPCASE(&b) first results the &b to &a (but with macro quoting). So the upcase applies to just the letter a. However the macro quoting is removed by the %upcase() fubction. So it is converting essentially %nrstr(&a) into plain old &A, which will resolve to being .
If you ever need to do anything near this complicated with the macro language you are using the wrong tool for the job. If you really need to manipulate data, like strings, then use SAS code. You can always store the result back into a macro variable if it will help with future code generation. Although for complex code generation you are better off using SAS code for that also.
The first %UPCASE converts the contents of macro variable a to upper case; the second %UPCASE gets the macro-quoted (because of the previous use of %NRSTR) string &a, and converts it to &A, which is then resolved by the %PUT to the original content of macro variable a, which is lowercase.
still can't get my head around it. Will come back after the exam. Hopefully this will not be tested in Advanced programming exam.
Registration is now open for SAS Innovate 2025 , our biggest and most exciting global event of the year! Join us in Orlando, FL, May 6-9.
Sign up by Dec. 31 to get the 2024 rate of just $495.
Register now!
Learn how use the CAT functions in SAS to join values from multiple variables into a single value.
Find more tutorials on the SAS Users YouTube channel.
Ready to level-up your skills? Choose your own adventure.