概要
WRITE コマンドは、現在の入出力デバイスに指定された出力を表示します (現在の入出力デバイスを設定するには、USE コマンドを使用して $IO 特殊関数の値を設定します)。WRITE には、以下の 2 つの形式があります。
引数なしの WRITE
引数なしの WRITE は、定義されたすべてのローカル変数の名前と値を一覧表示します。プロセス・プライベート・グローバル、グローバル変数、または特殊変数はリストしません。以下の形式で定義済みのローカル変数を 1 行に 1 個ずつリストします。
varname1=value1
varname2=value2
引数なしの WRITE は、すべてのタイプのローカル変数値を引用符付き文字列として表示します。キャノニック形式の数とオブジェクト参照は例外です。キャノニック形式の数は引用符に囲まれずに表示されます。オブジェクト参照 (OREF) は myoref=<OBJECT REFERENCE>[1@%SQL.Statement] のように表示されます。JSON 配列または JSON オブジェクトはオブジェクト参照 (OREF) として表示されます。ビット文字列値およびリスト値は引用符付きの文字列として表示され、データ値はエンコード形式で表示されます。
数値および数値文字列の表示を以下の例に示します。
SET str="fred"
SET num=+123.40
SET canonstr="456.7"
SET noncanon1="789.0"
SET noncanon2="+999"
WRITE
canonstr=456.7
noncanon1="789.0"
noncanon2="+999"
num=123.4
str="fred"
引数なしの WRITE は、以下の WRITE 出力の例のように、大文字/小文字を区別する文字列照合順にローカル変数を表示します。
A="Apple"
B="Banana"
a="apple varieties"
a1="macintosh"
a10="winesap"
a19="northern spy"
a2="golden delicious"
aa="crabapple varieties"
引数なしの WRITE は、以下の WRITE 出力の例のように、数値の照合を使用して、添え字ツリー順にローカル変数の添え字を表示します。
a(1)="United States"
a(1,1)="Northeastern Region"
a(1,1,1)="Maine"
a(1,1,2)="New Hampshire"
a(1,2)="Southeastern Region"
a(1,2,1)="Florida"
a(2)="Canada"
a(2,1)="Maritime Provinces"
a(10)="Argentina"
引数なしの WRITE は、フォームフィード ($CHAR(12)) やバックスペース ($CHAR(8)) などの制御文字を実行します。そのため、制御文字を定義するローカル変数は、以下の例に示すように表示されます。
SET name="fred"
SET number=123
SET bell=$CHAR(7)
SET formfeed=$CHAR(10)
SET backspace=$CHAR(8)
WRITE
backspace="
bell=""
formfeed="
"
name="fred"
number=123
複数のバックスペースは back というローカル変数を指定して以下のように表示されます:バックスペース 1 つ:back="、バックスペース 2 つ:back""、バックスペース 3 つ:bac"="、バックスペース 4 つ:ba"k="、バックスペース 5 つ:b"ck="、バックスペース 6 つ:"ack="、バックスペース 7 つ以上:"ack="。
引数なしの WRITE は、同じ行でその後に続くコマンドと最低 2 つの空白で区別されなければなりません。この後のコマンドが引数付きの WRITE である場合、その引数付きの WRITE には、適切な改行 f 形式制御引数を指定する必要があります。詳細は、以下の例を参照してください。
SET myvar="fred"
WRITE WRITE ; note two spaces following argumentless WRITE
WRITE WRITE myvar ; formatting needed
WRITE WRITE !,myvar ; formatting provided
引数なしの WRITE リストは、CTRL-C を発行すると中断され、<INTERRUPT> エラーが発生することがあります。
引数なしの WRITE を使用することで、定義済みのローカル変数をすべて表示できます。$ORDER 関数を使用することで、定義済みのローカル変数の限定されたサブセットを返すことができます。
引数付きの WRITE
WRITE は、1 つの writeargument またはコンマ区切りの writeargument のリストを取ります。WRITE コマンドは、expression、f、*integer、および *-integer の各引数の任意の組み合わせを取ります。
-
WRITE expression は、expression 引数に対応するデータ値を表示します。expression には、変数の名前、リテラル、またはリテラル値に評価される式を指定できます。
-
WRITE f は、目的の出力書式設定を提供します。引数付き形式の WRITE は、各引数値を区切ったり、文字列を示すための自動的な書式設定を提供しません。そのため、expression の値は f 書式設定で区切られない限り、単一の文字列として表示されます。
-
WRITE *integer は、整数コードによって表される文字を表示します。
-
WRITE *-integer は、デバイス制御操作を提供します。
WRITE 引数は、コンマで区切られます。例えば以下のようになります。
WRITE "numbers",1,2,3
WRITE "letters","ABC"
以下のように表示されます。
numbers123lettersABC
WRITE は、出力文字列の末尾に改行を追加しません。WRITE の出力を区切るには、f 引数の書式設定文字 (改行 (!) 文字など) を明示的に指定する必要があります。
WRITE "numbers ",1,2,3,!
WRITE "letters ","ABC"
以下のように表示されます。
numbers 123
letters ABC
引数
pc
オプションの後置条件式。InterSystems IRIS は、後置条件式が True (0 以外の数値に評価される) の場合にコマンドを実行します。InterSystems IRIS は、後置条件式が False (0 に評価される) の場合はコマンドを実行しません。引数なしの WRITE や引数付きの WRITE に対する後置条件式を指定することができます。詳細は、"ObjectScript の使用法" の "コマンド後置条件式" を参照してください。
expression
表示する値です。通常は、リテラル (引用符付き文字列、または数値) または変数になります。ただし、expression は、リテラル、変数、算術式、オブジェクト・メソッド、およびオブジェクト・プロパティを含む、任意の有効な ObjectScript 式にすることもできます。式に関する詳細は、"ObjectScript の使用法" を参照してください。
expression は、任意のタイプの変数にすることができます。これには、ローカル変数、プロセス・プライベート・グローバル、グローバル変数、および特殊変数も含まれます。変数には添え字を付けることができます。WRITE は指定した添え字ノードの値のみを表示します。
リテラルとして指定するか、変数として指定するかによって、データ値は以下のように表示されます。
-
文字列は括弧で囲まずに表示されます。一部の非表示文字 ($CHAR 0、1、2、14、15、28、127) は表示されません。その他の非表示文字 ($CHAR 3、16 ~ 26) はプレースホルダ文字として表示されます。制御文字 ($CHAR 7 ~ 13、27) は実行されます。例えば、$CHAR(8) はバックスペースを実行し、$CHAR(11) は垂直タブを実行します。
-
数字はキャノニック形式で表示されます。算術演算は実行されます。
-
拡張グローバル参照は、グローバルの値として表示されます。グローバル変数が定義されたネームスペースは示されません。存在しないネームスペースを指定した場合、InterSystems IRIS は <NAMESPACE> エラーを発行します。特権を持たないネームスペースを指定した場合、InterSystems IRIS は <PROTECT> エラーを発行し、続けてグローバル名とデータベース・パスを表示します (例:<PROTECT> ^myglobal,c:\intersystems\IRIS\mgr\)。
-
ObjectScript リスト構造化データはエンコード形式で表示されます。
-
InterSystems IRIS ビット文字列はエンコード形式で表示されます。
-
オブジェクト参照は OREF 値として表示されます。例えば、##class(%SQL.Statement).%New() は OREF 2@%SQL.Statement と表示されます。JSON ダイナミック・オブジェクトまたは JSON 動的配列は OREF 値として表示されます。OREF の詳細は、"クラスの定義と使用" の “OREF の基本” を参照してください。
-
オブジェクト・メソッドとプロパティは、プロパティの値、またはメソッドによって返された値を表示します。Get メソッドによって返される値は引数の現在の値です。Set メソッドによって返される値は引数の前の値です。添え字を使用して多次元プロパティを指定できます。添え字 (または空の括弧) を使用して非多次元プロパティを指定すると、<OBJECT DISPATCH> エラーが返されます。
-
%Status は 1 (成功)、または複雑なエンコード失敗ステータスとして表示されます。失敗ステータスの最初の文字は 0 です。
*integer
*integer 引数により、正の整数コードを使用して、現在のデバイスに文字を書き込めるようになります。これは、アスタリスクと、それに続く任意の有効な ObjectScript 式 (評価結果が文字に対応する正の整数になる式) で構成されます。*integer 引数は、出力可能文字または制御文字に対応することもあります。0 から 255 の整数は、対応する 8 ビットの ASCII 文字に評価されます。256 から 65534 までの範囲にある整数は、対応する 16 ビットの Unicode 文字に評価されます。
以下の例に示すように、*integer は整数コードを指定するか、整数コードに解決される式を指定できます。以下の例はすべて、"touché” という文字を返します。
WRITE !,"touch",*233
WRITE !,*67,*97,*99,*104,*233
SET accent=233
WRITE !,"touch",*accent ; variables are evaluated
WRITE !,"touch",*232+1 ; arithmetic operations are evaluated
WRITE !,"touch",*00233.999 ; fractional numbers are truncated to integers
作曲家ドボルザーク (Anton Dvorak) の名前を、適切なチェコ語アクセント記号で表示するために、以下を使用します。
WRITE "Anton Dvo",*345,*225,"k"
式の評価から返された整数は、制御文字に対応することもあります。このような文字は、ターゲット・デバイスに従って解釈されます。*integer 引数を使用して、画面表示を管理する制御文字 (例えば、改ページ *12) や、ターミナルで通知音を出す *7 などの特殊文字を挿入できます。
例えば、現在のデバイスがターミナルの場合、整数 0 から 30 は ASCII 制御文字として解釈されます。以下のコマンドは、ASCII コード 7 および 12 をターミナルに送ります。
WRITE *7 ; Sounds the bell
WRITE *12 ; Form feed (blank line)
次に、expression 引数と、改ページ文字を指定する *integer の組み合わせ例を示します。
WRITE "stepping",*12,"down",*12,"the",*12,"stairs"
*integer and $X, $Y
整数式は、ターミナルへの書き込み時に $X および $Y の特殊変数を変更することはありません。したがって WRITE "a" と WRITE $CHAR(97) の両方とも、$X に含まれる列番号値をインクリメントしますが、WRITE *97 は $X をインクリメントしません。
*integer を使用すると、$X および $Y の値を変更しないで、バックスペース (ASCII 8)、改行 (ASCII 10) またはその他の制御文字を発行できます。次のターミナルの例では、この整数式の使用法を示します。
バックスペース :
WRITE $X,"/",$CHAR(8),$X ; displays: 01
WRITE $X,"/",*8,$X ; displays: 02
改行 :
WRITE $Y,$CHAR(10),$Y
/* displays: 1
2 */
WRITE $Y,*10,$Y
/* displays: 4
4 */
詳細は、"入出力デバイス・ガイド" の "ターミナル入出力" と $X および $Y の特殊変数を参照してください。
*-integer
アスタリスクとそれに続く負の整数 (デバイス制御コード)。WRITE は、以下の一般的なデバイス制御コードをサポートします。
コード |
デバイス操作 |
*-1 |
次の READ で入力バッファをクリアします。 |
*-2 |
TCP デバイスまたは名前付きパイプを切断します。"入出力デバイス・ガイド" の "TCP クライアント/サーバ通信" および "ローカル・プロセス間通信" を参照してください。 |
*-3 |
出力バッファをデバイスにフラッシュします。これにより、ディスク上のファイルへの書き込みが強制されます。 |
*-9 |
シーケンシャル・ファイルのコンテンツを、現在のファイル・ポインタの位置で切り捨てます。ファイルを切り捨てるには、そのファイルが開いている必要があります (少なくとも “RW” アクセスで OPEN コマンドを使用します)。また、現在のデバイスとして設定されている必要があります (USE コマンドを使用します)。"入出力デバイス・ガイド" の "シーケンシャル・ファイル入出力" を参照してください。 |
*-10 |
入力バッファを即座にクリアします。 |
*-99 |
圧縮されたストリーム・データを送信します。"入出力デバイス・ガイド" の "TCP クライアント/サーバ通信" を参照してください。 |
出力バッファの制御
*-3 の制御は、出力バッファからデータをフラッシュするのに使用されます。これにより、物理デバイス上での書き込み操作が強制されます。つまり、まずデータがデバイス・バッファからオペレーティング・システムの入出力バッファにフラッシュされ、その後、オペレーティング・システムで、強制的にその入出力バッファが物理デバイスにフラッシュされます。この制御は一般に、ディスク上のシーケンシャル・ファイルに即座に書き込むことが強制される場合に使用されます。-3 は、Windows および UNIX プラットフォームでサポートされています。他のオペレーティング・システム上では、空命令となります。
TCP クライアント/サーバ通信での *-3 の使用法については、"入出力デバイス・ガイド" を参照してください。
例
以下の例の WRITE コマンドは、変数 var1 の現在の値を、現在の出力デバイスに送信します。
SET var1="hello world"
WRITE var1
以下の例の両方の WRITE コマンドは、pi に対する Unicode 文字を表示します。最初に $CHAR 関数を使用し、次に *integer 引数を使用します。
WRITE !,$CHAR(960)
WRITE !,*960
以下の例では、名前と姓の値を、それぞれに関連するラベル・テキストと共に書き込みます。WRITE コマンドは、同一の行の複数の引数を結合します。これは、その次の例にある 2 つの WRITE コマンドと同じです。! 文字は、改行を行う形式制御です。( ! 改行文字は、異なる 2 つの WRITE コマンドによってテキストが出力されるときに必要とされます。)
SET fname="Bertie"
SET lname="Wooster"
WRITE "First name: ",fname,!,"Last name: ",lname
以下と同等です。
SET fname="Bertie"
SET lname="Wooster"
WRITE "First name: ",fname,!
WRITE "Last name: ",lname
以下の例では、現在のデバイスがユーザのターミナルであると仮定しています。READ コマンドで、ユーザに名前と姓を入力するように求め、入力値をそれぞれ変数 fname、および lname に保存します。WRITE コマンドは、ユーザが確認できるように、fname および lname の値を表示します。出力名を区切るために、スペース文字 ("") を含む文字列が含まれています。
Test
READ !,"First name: ",fname
READ !,"Last name: ",lname
WRITE !,fname," ",lname
READ !,"Is this correct? (Y or N) ",check#1
IF "Nn"[check {
GOTO Test
}
以下の例は、client(1,n) ノードの現在の値を書き込みます。
SetElementValues
SET client(1,1)="Betty Smith"
SET client(1,2)="123 Primrose Path"
SET client(1,3)="Johnson City"
SET client(1,4)="TN"
DisplayElementValues
SET n=1
WHILE $DATA(client(1,n)) {
WRITE client(1,n),!
SET n=n+1
}
RETURN
以下の例は、オブジェクト・インスタンス・プロパティの現在の値を書き込みます。
SET myoref=##class(%SYS.NLS.Format).%New()
WRITE myoref.MonthAbbr
myoref はオブジェクト参照 (OREF)、MonthAbbr はオブジェクト・プロパティ名です。ドット構文は、オブジェクト式で使用します。ドットは、オブジェクト参照とオブジェクト・プロパティ名あるいはオブジェクト・メソッド名の間に配置します。
以下の例は、オブジェクト・メソッド GetFormatItem() が返す値を書き込みます。
SET myoref=##class(%SYS.NLS.Format).%New()
WRITE myoref.GetFormatItem("MonthAbbr")
以下の例は、オブジェクト・メソッド SetFormatItem() が返す値を書き込みます。通常、Set メソッドによって返される値は、引数の前の値です。
SET myoref=##class(%SYS.NLS.Format).%New()
SET oldval=myoref.GetFormatItem("MonthAbbr")
WRITE myoref.SetFormatItem("MonthAbbr"," J F M A M J J A S O N D")
WRITE myoref.GetFormatItem("MonthAbbr")
WRITE myoref.SetFormatItem("MonthAbbr",oldval)
WRITE myoref.GetFormatItem("MonthAbbr")
オブジェクトに対する WRITE コマンドには、以下のようにカスケード・ドット構文を持つ式を使用できます。
WRITE patient.Doctor.Hospital.Name
この例では、patient.Doctor オブジェクト・プロパティが Name プロパティを含む Hospital オブジェクトを参照します。そのため、このコマンドは指定した患者の医者と関連している病院名を書き込みます。同じカスケード・ドット構文は、オブジェクト・メソッドと一緒に使用できます。
オブジェクトの WRITE コマンドは、以下のデータ型プロパティ・メソッドのように、システム・レベル・メソッドで使用できます。
WRITE patient.AdmitDateIsValid(date)
この例で、AdmitDateIsValid() プロパティ・メソッドは、現在の patient オブジェクトの結果を返します。AdmitDateIsValid() は、AdmitDate プロパティのデータ型検証のために作成されたブーリアン・メソッドです。そのため、このコマンドは指定した日付が有効な場合は 1 を、無効の場合は 0 を書き込みます。
すべてのオブジェクト式は、オブジェクト参照が参照するスーパークラス、あるいはクラスを宣言することによって指定できるということに注意してください。上述の例は以下のようにも記述できます。
WRITE ##class(Patient)patient.Doctor.Hospital.Name
WRITE ##class(Patient)patient.AdmitDateIsValid(date)
$X と $Y を使用した WRITE
WRITE は、式の評価から生成される文字を一度に 1 つずつ左から右の順に表示します。InterSystems IRIS は $X 特殊変数と $Y 特殊変数の現在の出力位置を記録します。$X は現在の列位置を定義し、$Y は現在の行位置を定義します。1 文字表示されるたびに、$X は 1 つインクリメントされます。
以下の例では、WRITE コマンドは 11 字の文字列 Hello world を出力した後に列番号を与えます。
WRITE "Hello world"," "_$X," is the column number"
表示された文字列と $X 値 (,"",$X) の間に空白スペースを入れると、評価前にその空白スペースで $X がインクリメントされます。空白スペースを $X (," "_$X) に連結すると空白スペースは表示されますが、評価前に $X の値がインクリメントされません。
連結された空白を使用しても、$X と $Y の表示は、以下の例のように $X をインクリメントします。
WRITE $Y," "_$X
WRITE $X," "_$Y
最初の WRITE では、$X の値は $Y 値の桁数分インクリメントされます (ユーザの希望どおりでない場合があります)。2 番目の WRITE では、$X の値は 0 です。
$X を使用して、WRITE コマンド間に現在の列位置を表示することができます。WRITE コマンド間の列位置を制御するために、? 形式制御文字を使用することができます。? 形式文字は、$X が列 0 にあるときだけ意味を持ちます。以下の WRITE コマンドでは、? はインデントを行います。
WRITE ?5,"Hello world",!
WRITE "Hello",!?5,"world"