例
以下の例では、包含的 KILL が、ローカル変数 a、b、および d を削除し、プロセス・プライベート・グローバル ^||ppglob およびその添え字すべてを削除します。他の変数には影響はありません。
SET ^||ppglob(1)="fruit"
SET ^||ppglob(1,1)="apples"
SET ^||ppglob(1,2)="oranges"
SET a=1,b=2,c=3,d=4,e=5
KILL a,b,d,^||ppglob
WRITE "a=",$DATA(a)," b=",$DATA(b)," c=",$DATA(c)," d=",$DATA(d)," e=",$DATA(e),!
WRITE "^||ppglob(1)=",$DATA(^||ppglob(1)),
" ^||ppglob(1,1)=",$DATA(^||ppglob(1,1)),
" ^||ppglob(1,2)=",$DATA(^||ppglob(1,2))
以下の例では、包含的 KILL がローカル変数 a(1) およびその添え字 a(1,1)、a(1,2) および a(1,1,1) を削除します。ローカル変数 a、a(2)、および a(2,1) は削除されません。
SET a="food",a(1)="fruit",a(2)="vegetables"
SET a(1,1)="apple",a(1,1,1)="mackintosh",a(1,2)="banana"
SET a(2,1)="artichoke"
WRITE "before KILL:",!
WRITE $DATA(a)," ",$DATA(a(1))," ",$DATA(a(1,1))," ",$DATA(a(1,1,1))," ",
$DATA(a(2))," ",$DATA(a(2,1)),!
KILL a(1)
WRITE "after KILL:",!
WRITE $DATA(a)," ",$DATA(a(1))," ",$DATA(a(1,1))," ",$DATA(a(1,1,1))," ",
$DATA(a(2))," ",$DATA(a(2,1))
以下の例では、排他的 KILL が変数 d および e 以外のローカル変数をすべて削除します。
SET a=1,b=2,c=3,d=4,e=5
KILL (d,e)
WRITE "a=",$DATA(a)," b=",$DATA(b)," c=",$DATA(c)," d=",$DATA(d)," e=",$DATA(e)
排他的 KILL がオブジェクト変数を削除するので、上記のプログラムはターミナル・セッションから作動しますが、オブジェクト・メソッド内部では作動しないということに注意してください。
以下の例では、包含的 KILL が 2 つプロセス・プライベート・グローバルを削除し、排他的 KILL が変数 d および e 以外のローカル変数をすべて削除します。
SET ^||a="one",^||b="two",^||c="three"
SET a=1,b=2,c=3,d=4,e=5
KILL ^||a,^||c,(d,e)
WRITE "a=",$DATA(a)," b=",$DATA(b)," c=",$DATA(c)," d=",$DATA(d)," e=",$DATA(e),!
WRITE "^||a=",$DATA(^||a)," ^||b=",$DATA(^||b)," ^||c=",$DATA(^||c)
排他的 KILL
排他的 KILL は、明示的に指定された変数を除く、すべてのローカル変数を削除します。リストされた名前はコンマで区切られます。括弧は必須です。
排他的 KILL を呼び出す際に、例外リストで指定されたローカル変数を定義する必要はありません。
例外リストに含むことができるのは、ローカルの添え字なしの変数名だけです。例えば、複数の添え字ノードを持つ fruitbasket という名前のローカル変数配列がある場合、KILL (fruitbasket) を指定することで、ローカル変数配列全体を保持することができます。排他的 KILL を使用して、個別の添え字ノードを選択的に保持することはできません。
例外リストには、オブジェクト参照 (OREF) を表すローカル変数を格納できます。例外リストに、オブジェクト参照のプロパティを格納することはできません。
排他的リストでは、プロセス・プライベート・グローバル、グローバル、または特殊変数を指定できません。これらの変数を指定しようとすると、<SYNTAX> エラーが返されます。例外リストで指定されていないローカル変数は削除されます。以降このような変数を参照すると、<UNDEFINED> エラーが返されます。排他的 KILL は、プロセス・プライベート・グローバル、グローバル、または特殊変数に対して効力がありません。しかし、システム・オブジェクトによって生成されたローカル変数を削除することはできます。
KILL を配列で使用する
包含的 KILL を使用して、配列全体、または配列内の選択したノードだけを削除できます。指定された配列は、ローカル変数、プロセス・プライベート・グローバル、またはグローバル変数のいずれかです。
-
ローカル変数配列を削除するには、KILL のいずれの形式を使用することもできます。
-
ローカル変数配列内の選択されたノードを削除するには、包含的 KILL を使用しなければなりません。
-
グローバル変数配列を削除するには、包含的 KILL を使用しなければなりません。
-
グローバル変数配列内の選択されたノードを削除するには、包含的 KILL を使用しなければなりません。
添え字ノード付きのグローバル変数に関する詳細は、"グローバルの使用法" の "グローバル構造" を参照してください。
配列は、包含的 KILL にその名前を指定するだけで削除できます。例えば以下のコマンドでは、グローバル配列 ^fruitbasket とその従属ノードすべてを削除します。
SET ^fruitbasket(1)="fruit"
SET ^fruitbasket(1,1)="apples"
SET ^fruitbasket(1,2)="oranges"
WRITE "Before KILL:",!
WRITE "^fruitbasket(1)=",$DATA(^fruitbasket(1)),
" ^fruitbasket(1,1)=",$DATA(^fruitbasket(1,1)),
" ^fruitbasket(1,2)=",$DATA(^fruitbasket(1,1)),!
KILL ^fruitbasket
WRITE "After KILL:",!
WRITE "^fruitbasket(1)=",$DATA(^fruitbasket(1)),
" ^fruitbasket(1,1)=",$DATA(^fruitbasket(1,1)),
" ^fruitbasket(1,2)=",$DATA(^fruitbasket(1,1))
配列ノードを削除するには、適切な添え字を指定します。例えば以下の KILL コマンドは、添え字 1、および 2 のノードを削除します。
SET ^fruitbasket(1)="fruit"
SET ^fruitbasket(1,1)="apples"
SET ^fruitbasket(1,2)="oranges"
SET ^fruitbasket(1,2,1)="navel"
SET ^fruitbasket(1,2,2)="mandarin"
WRITE ^fruitbasket(1)," contains ",^fruitbasket(1,1),
" and ",^fruitbasket(1,2),!
WRITE ^fruitbasket(1,2)," contains ",^fruitbasket(1,2,1),
" and ",^fruitbasket(1,2,2),!
KILL ^fruitbasket(1,2)
WRITE "1st level node: ",$DATA(^fruitbasket(1)),!
WRITE "2nd level node: ",$DATA(^fruitbasket(1,1)),!
WRITE "Deleted 2nd level node: ",$DATA(^fruitbasket(1,2)),!
WRITE "3rd level node under deleted 2nd: ",$DATA(^fruitbasket(1,2,1)),!
QUIT
配列ノードを削除すると、自動的にそのノードに従属するノードすべてと、削除されたノードへのポインタだけを含んでいた直前のノードがすべて削除されます。検出されたノードがその配列の唯一のノードである場合は、ノードと共に配列自体も削除されます。
複数のローカル変数配列を削除するには、上述のとおり、KILL の包含形式と排他形式の両方を使用できます。例えば以下のコマンドは、array1 および array2 を除く、すべてのローカル配列を削除します。
KILL (array1,array2)
複数の配列ノードを削除するには、KILL の包含形式だけしか使用できません。例えば以下のコマンドは、各配列から 1 ノードを削除しながら、指定された 3 つのノードを削除します。
KILL array1(2,4),array2(3,2),array3(1,7)
ノードは同じ配列内でも、他の配列内でもかまいません。
ZKILL コマンドを使用して、指定されたローカル、あるいはグローバル配列ノードを削除する場合もあります。KILL とは異なり、ZKILL は指定されたノードのすべての従属ノードを削除することはできません。
パラメータ渡しの KILL
パラメータを渡す場合、値は、外部関数、または DO コマンドで呼び出されるサブルーチンに渡されます。外部関数またはサブルーチンに渡される値は、実パラメータ・リストと呼ばれるコンマで区切られたリストで指定します。指定されたそれぞれの値は、その位置に従って、外部関数またはサブルーチンで定義されている仮パラメータ・リストの対応する変数にマップされます。
実パラメータ・リストの指定方法に従って、パラメータ渡しは、値または参照のいずれかによる方法で行われます。この 2 つのパラメータ渡し方法の詳細は、"ObjectScript の使用法" の "パラメータ渡し" を参照してください。
仮パラメータ・リストの変数に KILL を実行すると、それが値によって渡されていたか、参照によって渡されていたかによって結果が異なります。
値によって変数の受け渡しを行っている場合は、以下のようになります。
以下の値による受け渡しの例では、Subrt1 で実行する KILL によって、仮変数 x は削除されますが、実変数 a は影響を受けません。
Test
SET a=17
WRITE !,"Before Subrt1 a: ",$DATA(a)
DO Subrt1(a)
WRITE !,"After Subrt1 a: ",$DATA(a)
QUIT
Subrt1(x)
WRITE !,"pre-kill x: ",$DATA(x)
KILL x
WRITE !,"post-kill x: ",$DATA(x)
QUIT
参照によって変数の受け渡しを行っている場合は、以下のようになります。
以下の参照による受け渡しの例では、Subrt1 で実行する KILL によって、仮変数 x と実変数 a の両方が削除されます。
Test
SET a=17
WRITE !,"Before Subrt1 a: ",$DATA(a)
DO Subrt1(.a)
WRITE !,"After Subrt1 a: ",$DATA(a)
QUIT
Subrt1(&x)
WRITE !,"pre-kill x: ",$DATA(x)
KILL x
WRITE !,"post-kill x: ",$DATA(x)
QUIT
一般的には、仮パラメータ・リストに指定されている変数に KILL を実行すべきではありません。InterSystems IRIS は、パラメータ渡し (値による場合でも、参照による場合でも) を使用する関数、またはサブルーチンに遭遇すると、仮リストのそれぞれの変数に対して、NEW コマンドを暗黙的に実行します。Caché は、関数またはサブルーチンを終了すると、仮リストのそれぞれの変数に対して、今度は暗黙の KILL コマンドを実行します。参照による受け渡しを使用する仮変数の場合は、KILL を実行する前に、(仮変数に対して行われた変更を反映するために) 対応する実変数を更新します。