$ZREFERENCE (ObjectScript)
構文
$ZREFERENCE
$ZR
概要
$ZREFERENCE は、最後のグローバル参照の名前と添え字を含みます。これは、ネイキッド・インジケータとして知られています。
最後のグローバル参照とは、最後にアクセスされたグローバル・ノードです。通常は最後に行われたグローバルへの明示的な参照です。ただし、特定のコマンドは内部的に $ORDER および $QUERY 関数を使用してグローバル添え字を検索したり、内部的に他のグローバルを参照したりすることがあります。このような状況が発生すると、$ZREFERENCE には最後にアクセスされたグローバル・ノードが含まれ、コマンド引数として渡されたグローバル・ノードではない場合があります。
最後のグローバル参照は、グローバル (^myglob)、またはプロセス・プライベート・グローバル (^||myppg) のいずれかです。$ZREFERENCE は、後続でその変数に対してどのプロセス・プライベート・グローバル接頭語が使用されるかに関わらず、その変数に対して最初に使用されていた形式でプロセス・プライベート・グローバル接頭語を返します。以下の $ZREFERENCE の説明において、“グローバル” という言葉は、両方の種類の変数を指します。
最後のグローバル参照とは、コマンドまたは関数から最近参照されたグローバルのことです。ObjectScript は処理を左から右の順に実行するので、最後のグローバル参照は、常に一番右端のグローバルになります。コマンドまたは関数が複数の引数を取る場合、一番右端の引数で指定されたグローバルが最後のグローバル参照です。引数が複数のグローバル参照を含む場合、一番右端に指定されたグローバルが最後のグローバル参照です。この厳密な左から右の順は、括弧を使用して演算の順序を定義する場合でも、正しく保持されます。
明示的なグローバル参照が発行されるとき、InterSystems IRIS は $ZREFERENCE を更新します。グローバル参照に評価される式 (ローカル変数など) を呼び出しても、$ZREFERENCE は更新されません。
最後のグローバル参照が失敗していたとしても、$ZREFERENCE には、最後のグローバル参照が含まれます。コマンドが未定義のグローバルを参照して <UNDEFINED> エラーが返された場合でも、グローバルが定義されたかのように、InterSystems IRIS はそのグローバル参照に $ZREFERENCE を更新します。この動作は、%SYSTEM.Process.Undefined()Opens in a new tab メソッドの設定には影響されません。
このコマンドの実行に失敗していたとしても、多くの場合、$ZREFERENCE には、最後のグローバル参照が含まれます。各グローバルが参照されると、InterSystems IRIS によって $ZREFERENCE が更新されます。例えば、(数値を 0 で割ろうとすると) <DIVIDE> エラーを返すコマンドは、エラーが発生する前にコマンド内で参照された最後のグローバルに $ZREFERENCE を更新します。しかし、<SYNTAX> エラーは $ZREFERENCE を更新しません。
長いグローバル名
グローバル名が 31 文字より長い (^ などのグローバル接頭語を除く) 場合、$ZREFERENCE は 31 文字に短縮したグローバル名を返します。長いグローバル名の処理の詳細は、"グローバル" を参照してください。
ネイキッド・グローバル参照
最後のグローバル参照がネイキッド・グローバル参照である場合、$ZREFERENCE には現在のネイキッド・グローバル参照の完全な形式 (外部で読み取り可能) が含まれます。詳細は、以下の例を参照してください。
SET ^MyData(1)="fruit"
SET ^MyData(1,1)="apples" ; Full global reference
SET ^(2)="oranges" ; Naked global reference,
; implicitly ^MyData(1,2)
WRITE !,$ZREFERENCE ; Returns "^MyData(1,2)"
ネイキッド・グローバル参照の詳細は、"多次元ストレージの使用法 (グローバル)" を参照してください。
Extended Global Reference (拡張グローバル参照)
拡張グローバル参照は、現在のネームスペース以外のネームスペースにあるグローバルの参照に使用されます。拡張グローバル参照を使用して、コマンドがグローバル変数を参照する場合、$ZREFERENCE 値はその拡張グローバル参照を含みます。InterSystems IRIS は、以下の状況において、拡張グローバル参照を返します。
-
最後のグローバル参照が、拡張グローバル参照を使用して別のネームスペースにあるグローバルを参照する場合。
-
最後のグローバル参照が、拡張グローバル参照を使用して現在のネームスペースにあるグローバルを参照する場合。
-
最後のグローバル参照がリモート参照 (リモート・システム上のグローバル) である場合。
いかなる場合でも、$ZREFERENCE は、グローバル参照でどのように指定されたかに関わらず、ネームスペース名をすべて大文字で返します。
グローバル添え字と拡張グローバル参照の詳細は、"グローバルについての正式な規則" および "拡張グローバル参照" を参照してください。
$ZREFERENCE を更新する処理
$ZREFERENCE 特殊変数は NULL 文字列 ("") に初期化されます。現在のネームスペースを変更すると、$ZREFERENCE は NULL 文字列にリセットされます。
以下の処理は、最近参照されたグローバルに $ZREFERENCE を設定します。
-
グローバルを引数として使用するコマンドまたは関数。複数のグローバルを使用する場合、$ZREFERENCE は、最も右に位置するグローバルに設定されます (ただし、$ORDER を除く)。
-
グローバルを後置条件式として使用するコマンド。
-
未定義のグローバルを参照して、<UNDEFINED> エラーを生成するか、またはグローバルを定義する ($INCREMENT の場合) コマンドまたは関数。
$ZREFERENCE の設定
SET コマンドを使用すると、この特殊変数を以下のように設定することができます。
-
NULL 文字列 ("") に設定します。これを実行すると、ネイキッド・インジケータを削除してしまいます。次のグローバル参照がネイキッド・グローバル参照の場合、InterSystems IRIS は <NAKED> エラーを返します。
-
有効なグローバル参照 (定義済みまたは未定義) に設定します。これによって、その後のネイキッド参照では、ユーザによって設定された値が最後の実際のグローバル参照であるかのように使用されます。
SET コマンドを使用して、他の方法で $ZREFERENCE を変更することはできません。変更を試みると、<SYNTAX> エラーが返されます。
例
以下の例は、最後のグローバル参照を返します。
SET ^a(1,1)="Hello" ; Full global reference
SET ^(2)=" world!" ; Naked global reference
WRITE $ZREFERENCE
これは、以下を返します。
^a(1,2)
以下の例は、複数の異なるコマンドからグローバル参照を返します。WRITE と ZWRITE は、同じグローバル参照でも異なる表示を行うことに注意してください。
SET (^barney,^betty,^wilma,^fred)="flintstone"
WRITE !,$ZREFERENCE
KILL ^flies
WRITE !,$ZREFERENCE
WRITE !,^fred
WRITE !,$ZREFERENCE,!
ZWRITE ^fred
WRITE !,$ZREFERENCE
これは、以下を返します。
^fred ; last of several globals set in left-to-right order ^flies ; KILL sets global indicator, though no global to kill flintstone ; WRITE global ^fred ; global from WRITE ^fred="flintstone" ; ZWRITE global ^fred("") ; global from ZWRITE
以下の例は、拡張グローバル参照を返します。ネームスペース名は常に、大文字で返されることに注意してください。
SET ^["samples"]a(1,1)="Hello"
SET ^(2)=" world!"
WRITE $ZREFERENCE
QUIT
これは、以下を返します。
^["SAMPLES"]a(1,2)
以下の例は、最後のグローバル参照を返します。この場合は ^a(1) です。これは、$LENGTH 関数の引数として使用されます。
SET ^a(1)="abcdefghijklmnopqrstuvwxyz"
SET ^b(1)="1234567890"
SET x=$LENGTH(^a(1))
WRITE $ZREFERENCE
QUIT
以下の例では、$ZREFERENCE に設定されている値が最後のグローバル参照であるかのように返されます。この場合、値は ^a(1,1) です。
SET ^a(1,1)="abcdefghijklmnopqrstuvwxyz"
SET ^b(1,1)="1234567890"
WRITE !,^(1)
; Naked reference uses last global
SET $ZREFERENCE="^a(1,1)"
WRITE !,$ZREFERENCE
WRITE !,^(1)
; Naked reference uses $ZREFERENCE
; value, rather than last global.
以下の例は、拡張グローバル参照を設定します。引用符が二重になっていることに注目してください。
KILL ^x
WRITE !,$ZREFERENCE
SET $ZREFERENCE="^[""samples""]a(1,2)"
WRITE !,$ZREFERENCE
関連項目
-
ZNSPACE コマンド
-
$NAMESPACE 特殊変数
-
$ZNSPACE 特殊変数