前のページ|次のページ

テキストのクォーティング解除

シンボルの意味の復元

値をクォーティング解除するとは、それまでマクロクォーティング関数によってマスクされていた項目のシンボルの意味を復元するという意味です。
通常、ある項目がマクロクォーティング関数によってマスクされると、次のいずれかが発生するまで、その項目は特殊な状態に置かれます。
  • その項目を%UNQUOTE関数で囲む。詳細については、%UNQUOTE関数を参照してください。
  • その項目がワードスキャナから削除され、DATAステップコンパイラ、SASプロシジャ、SASマクロ機能、またはSASシステムの他の部分に渡される。
  • その項目が、%SCAN関数、%SUBSTR関数、または%UPCASE関数によって、クォーティング解除された結果として返される。(これらのいずれかの操作中に値のマスク状態を維持するには、%QSCAN関数、%QSUBSTR関数、または%QUPCASE関数を使用します。詳細については、マクロクォーティングを実行するその他の関数を参照してください。
項目は、ワードスキャナからSASの他の処理に渡されるときに、自動的にクォーティング解除されます。そのため、原則として項目をクォーティング解除する必要はありません。ただし、次の2つの状況においては、マスクされた項目に%UNQUOTE関数を使用して、元の意味を復元する必要がある場合があります。
  • それまでマクロクォーティング関数によって値をマスクしていたが、同じマクロ内で、後からその値の意味を復元して使用する場合。
  • マクロクォーティング関数を使用してテキストをマスクすることで、ワードスキャナによるそのテキストのトークン化方法を変更し、一見正しく見えるがSASコンパイラによって認識されないSASステートメントを生成する場合。

クォーティング解除の例

1回はマクロクォーティングされた形式、もう1回はクォーティング解除された形式で、値を2回使用する例を次に示します。マクロANALYZEが2つの統計モデルの出力を対話的に比較できるようにするシステムの一部であると仮定します。まず、演算子を入力して、テストする関係(一方の結果が他方よりも大きい、他方と等しいなど)を指定します。マクロANALYZEは次を実行します。
  • マクロクォーティングされた演算子の値をテストして正しく入力されたことを確認
  • クォーティング解除された値を使用して指定された値を比較
  • メッセージを書き込む
コメント内の番号と、次のパラグラフを対応付けてください。
%macro analyze(stat);
   data _null_;
      set out1;
      call symput('v1',&stat);
   run;

   data _null_;
      set out2;
      call symput('v2',&stat);
   run;

   %put Preliminary test. Enter the operator.;
   %input;
   %let op=%bquote(&sysbuffr);
   %if &op=%str(=<) %then %let op=%str(<=);
   %else %if &op=%str(=>) %then %let op=%str(>=);
   %if &v1 %unquote(&op) &v2 %then
      %put You might proceed with the analysis.;
   %else
      %do;
         %put &stat from out1 is not &op &stat from out2.;
         %put Please check your previous models.;
      %end;
%mend analyze;
SYSBUFFRの値を、%BQUOTE関数を使用してマスクします。この関数は、マークが付いていない不一致の引用符やかっこを含む(ただし、アンパサンドとパーセント記号を除く)置換済み項目をマスクします。
%IF条件は、マクロ変数OPの値を文字列と比較して、OPの値に正しい演算子のシンボルが含まれているかどうかを調べます。間違った順序のシンボルが値に含まれている場合、%THENステートメントによって正しく修正されます。マクロクォーティング関数によってマスクされた値はマスクされたままになるため、%IF条件の左側の&OP参照をマスクする必要はありません。
マクロを定義するときに、%IF条件の右側の文字と%LETステートメントの文字の値は見ることができます。そのため、%STR関数を使用してこれらの文字をマスクできます。これらをコンパイル時にマスクしておくと、ANALYZEを実行するたびにマスクするよりも効率的です。
マクロ変数OPの値を%IF条件の演算子として使用するには、%UNQUOTE関数を使用して演算子の意味を復元する必要があります。

自動的にクォーティング解除されない場合の対処方法

マクロクォーティング関数によってマスクされた項目からマクロプロセッサがテキストを生成する場合、通常は、マクロクォーティングされた項目の自動的なクォーティング解除をSASに行わせることができます。たとえば、マクロ変数PRINTITを次のように定義するとします。
%let printit=%str(proc print; run;);
次に、このマクロ変数をプログラム内で次のように使用します。
%put *** This code prints the data set: &printit ***;
マクロプロセッサがマクロ変数からテキストを生成するときに、マクロクォーティング関数によってマスクされた項目は自動的にクォーティング解除されます。それらの項目がSASの他の処理に渡されると、それまでマスクされていたセミコロンが正常に機能します。
まれに、マクロクォーティング関数を使用してテキストをマスクし、ワードスキャナによるテキストのトークン化方法を変更することがあります。(ワードスキャナとトークン化については、SASプログラムとマクロ処理およびマクロ処理で説明されています。)たとえば、%BQUOTE関数で置換されて生成された一重引用符または二重引用符は、別々のトークンになります。ワードスキャナは、入力スタック内のこのトークンを、リテラルトークンの境界として使用しません。%BQUOTE関数によって一度マスクされて生成されたテキストが、一見正しく見えるのにSASに受入れられない場合、%UNQUOTE関数を使用して正常なトークン化を復元する必要がある場合があります。
前のページ|次のページ|ページの先頭へ