Resolving multiple ampersands with macro variables

前端 未结 2 1201
醉话见心
醉话见心 2020-12-19 16:48

This code works in SAS EG run on local (hidden sensitive information):

*---- two values: DEV (ALIASDEV) and PROD (ALIASPROD);
%let my_environment = ALIASDEV;         


        
相关标签:
2条回答
  • 2020-12-19 17:21

    I don't know why it worked on the local, but the ampersands require a third to resolve properly. Any time you store the value of a macro variable in another macro variable, you must use three ampersands to retrieve it.

    Basic use cases:

    • Two ampersands allows you to resolve macro variables that contain other macro variables as part of the name. IE, if you have &val_sept and &val_oct, you can use &&val_&mon to retrieve it assuming %let mon=sept.
    • Three ampersands allow you to retrieve a macro variable that is contained as a value of another macro variable. So if you have &sept and &oct, then you would use &&&mon. to retrieve &sept from a variable %let mon=sept.

    That's because of how multiple ampersands resolve; SAS makes multiple passes through until all are resolved.

    In each pass:

    1. Every pair of ampersands resolves down to 1 ampersand, and is held aside.
    2. If there is a single ampersand left over, it resolves along with text after it as a macro variable, and is replaced by the value stored in such.

    So:

    %let x=a;
    %let a=b;
    %let b=c;
    
    %put &&x;
    

    1: &&x -> (&&)(x) -> (&)(x) -> &x 2: &x -> a

    %put &&&x;
    

    1: &&&x -> (&&)(&x) -> (&)(a) -> &a 2: &a -> b

    %put &&&&x;
    

    1: &&&&x -> (&&)(&&) (x) -> (&)(&)(x) -> &&x 2: &&x -> (&&)(x) -> (&)(x) -> &x 2: &x -> a

    %put &&&&&x;
    

    1: &&&&&x -> (&&)(&&)(&x) -> (&)(&)(a) -> &&a 2: &&a -> (&&)(a) -> (&a) 3: &a -> b

    %put &&&&&&x;
    

    1: &&&&&&x -> (&&)(&&)(&&) (x) -> (&)(&)(&)(x) -> &&&x 2: &&&a -> (&&)(&x) -> (&a) 3: &a -> b

    Four ampersands is the most interesting to me, since adding one actually takes you back a step, effectively.

    See my answer on sas MACRO ampersand for more detail.

    0 讨论(0)
  • 2020-12-19 17:22

    You may need an extra & in your path specification, so that it resolves to "(hidden_tns_dev)" instead of "ALIASDEV", like this: path="&&&my_environment" .

    0 讨论(0)
提交回复
热议问题