READ (ObjectScript)
構文
READ:pc readargument,...
R:pc readargument,...
readargument には、以下を指定できます。
fchar
prompt
variable:timeout
*variable:timeout
variable#length:timeout
引数
引数 | 説明 |
---|---|
pc | オプション — 後置条件式 |
fchar | オプション — 1 つ、または複数の形式制御文字。許可されている文字は、!、#、?、および / です。 |
prompt | オプション — ユーザ入力を求めるプロンプト、またはメッセージとして表示される文字列リテラル。引用符で囲まれます。 |
variable | 入力データを受け取る変数です。ローカル変数、プロセス・プライベート・グローバル、またはグローバルのいずれかです。添字なしでも添字付きでもかまいません。 |
length | オプション — 受け入れ可能な文字数。整数、または整数に評価される式または変数のいずれかとして指定されます。先頭の # 記号は必須です。読み取る文字数が指定されていない場合、InterSystems IRIS は、既定の 32,767 文字を想定します。 |
timeout | オプション — 整数として指定される、要求が成功するのを待機する秒数。秒の小数部は整数部分に切り捨てられます。先頭のコロン (:) は必須です。省略した場合、InterSystems IRIS は無限に待機します。 |
コンマで引数を区切ることで、複数の fchar 引数または prompt 引数を指定できます。
概要
READ コマンドは、現在のデバイスからの入力を受け入れます。現在のデバイスは、OPEN コマンドと USE コマンドを使用して設定されています。$IO 特殊変数は、現在のデバイスのデバイス ID を含みます。既定では、現在のデバイスはユーザ端末です。
READ コマンドは、プログラムが現在のデバイスからの入力を受け取るまで、またはタイムアウトまで、プログラムの実行を一時停止します。このため現在のデバイスがユーザ端末の場合は、READ コマンドはバックグラウンド (非対話的) ジョブとして実行されているプログラムで使用することはできません。
variable 引数は、入力文字を受け取ります。READ は、variable が未定義の場合は最初に variable を定義し、variable が前の値を持つ場合は消去します。したがって、variable に入力データがない場合 (例えば、文字が入力される前に READ がタイムアウトになった場合)、variable は定義され、NULL 文字列を含みます。これは、唯一入力された文字がターミネータ文字 (例えば、ユーザ端末から [Enter] を押すなど) の場合でも同様です。中断 (例えば [Ctrl-C]) の影響は、以下を参照してください。
固定長、および可変長の読み取りでは、variable は読み取り処理を終了するターミネータ文字を格納しません。単一文字の読み取りは variable を別に処理します。variable を使用する単一文字の読み取りは、以下を参照してください。
オプションのタイムアウト値を指定する場合、READ はすべての文字が入力される前にタイムアウトできます。READ がタイムアウトすると、タイムアウトの発生前に入力された文字は、variable に格納されます。この場合、ターミネータ文字の入力は必要ありません。タイムアウトの発生前に入力された文字が variable に転送され、READ が終了し、$TEST が 0 に設定されます。
READ 処理には、可変長読み取り、固定長読み取り、単一文字読み取りの 3 種類あります。これら 3 つは、タイムアウト引数付き、またはなしで指定することができます。単一の READ コマンドは、3 種類の任意の組み合わせで複数の READ 処理を含むことができます。それぞれの読み取り処理は、左から右の順に個別に実行されます。READ コマンドは、任意の数のコンマで区切られた prompt 引数および fchar 引数を含むこともできます。
3 種類の READ 処理の詳細は、以下のとおりです。
-
可変長読み取りの形式は、以下のとおりです。
READ variable
これは、任意の数の入力文字を受け取り、それを指定された variable に格納します。入力はターミネータ文字で終了します。通常は、[Enter] キーを押すことで終了できます。(ターミネータ文字ではなく) 入力文字は、variable に格納されます。
-
固定長読み取りの形式は、以下のとおりです。
READ variable#length
これは、最大 length 個の入力文字を受け取り、それを指定された variable に格納します。入力は、指定された数の文字が入力されたとき、またはターミネータ文字に遭遇したときに自動的に終了します。例えば、4 固定長読み取りで 2 つの文字を入力し、[Enter] キーを押します。(ターミネータ文字ではなく) 入力文字は、variable に格納されます。
-
単一文字読み取りの形式は、以下のとおりです。
READ *variable
単一文字の読み取りは単一の入力文字を受け取り、指定された variable に同等の ASCII 数値を格納します。これは文字自体を $ZB と $KEY 特殊変数に格納します。入力は、単一文字が入力されたときに自動的に終了します。ターミネータ文字は単一文字入力と見なされ、格納されます。オプションの timeout 引数が指定されている場合にタイムアウトが発生すると、タイムアウトは variable を -1 に設定します。
引数
pc
オプションの後置条件式です。InterSystems IRIS は、後置条件式が True (0 以外の数値に評価される) の場合にコマンドを実行します。InterSystems IRIS は、後置条件式が False (0 に評価される) の場合はコマンドを実行しません。詳細は、"コマンド後置条件式" を参照してください。
fchar
以下の形式制御コードのいずれかを指定します。キーボードからのユーザ入力で使用されると、これらの制御は指定された prompt、またはユーザ入力エリアを表示する画面内の位置を決定します。
! は、新しい行を開始します。複数の感嘆符を指定できます。
# は、新規ページを開始します。端末で、現在の画面が消去され、新しい画面の一番上から開始されます。
?n は、n 番目の列に配置します。n には正の整数を指定します。
/keyword(parameters) は、デバイス制御ニーモニックです。ビデオ端末のカーソルを位置決めするなどのデバイス特有の機能を実行します。スラッシュ文字 (/) の後にはキーワードが続きます。このキーワードには、オプションで 1 つ、または複数の括弧で囲まれたパラメータが続きます。複数のパラメータは、コンマで区切られます。キーワードは、現在のデバイスのニーモニック・スペース・ルーチン内のエントリ・ポイント・ラベルです。
デバイス・タイプの既定のニーモニック・スペースは、以下のいずれかの方法で指定できます。
-
管理ポータルに進み、[システム管理]、[構成]、[デバイス設定]、[IO設定] の順に選択します。[ファイル]、[その他]、または [ターミナル] のニーモニック・スペース設定を表示して編集します。
-
デバイスに対して OPEN コマンド、または USE コマンドを実行するときに /mnespace パラメータを含めます。
形式制御は、複数指定することができます。例えば、#!!!?20 は、新規ページ (または画面) のトップから開始し、3 行下り、列 20 に移動することを意味しています。形式制御文字は、コンマで区切られた別の READ 引数と混在させることができます。以下はその例です。
READ #!!,"Please enter",!,"your name: ",x,!,"THANK YOU"
以下のように表示されます。
>
Please enter
your name: FRED
THANK YOU
>
prompt
端末キーボードからのユーザ入力を求めるプロンプト、またはメッセージとして表示される文字列リテラルです。通常、prompt 引数の後に variable が続く場合は、表示されたリテラルの後にユーザ入力エリアが続きます。コンマで区切られた一連の prompt 引数および fchar 引数を使用すると、複数行のプロンプトやメッセージを指定できます。
variable
入力データを受け取るローカル変数、プロセス・プライベート・グローバル、またはグローバルです。添字なしでも添字付きでもかまいません。指定された変数が既に存在しない場合、InterSystems IRIS はその変数を READ 処理の開始時に定義します。指定された変数が定義され、値を持つ場合、InterSystems IRIS はこの値を READ 処理の開始時に消去します。
文字を入力すると、その文字は variable に格納されます。オプションの timeout 引数が指定されていて、読み取り処理がタイムアウトによって中断された場合、その時点までに入力された文字は variable に格納されます (ただし Ctrl-C 中断に遭遇したときの variable の振る舞いには注意してください。詳細は以下のとおりです)。
印字不能文字 (Tab など) は、variable に格納されます。ターミネータ文字は、すべての種類の読み取り処理を終了させるために使用されます。例えば端末から、[Enter] キーを押して読み取り処理を終了する場合などです。このターミネータ文字は、可変長や固定長の読み取りに対して variable に格納されません。単一文字読み取りに対しては、ターミネータ文字は variable に格納されます。
length
固定長の読み取りに対して、受け入れ可能な最大文字数を指定する正の整数です。READ は、指定された文字数が入力されたとき、またはターミネータ文字に遭遇したときのいずれかに終了します。引数はオプションですが、指定される場合、先頭の # 記号は必須です。
読み取る文字数が指定されていない場合、InterSystems IRIS は、既定の 32,767 文字を想定します。
ゼロや負数を指定すると <SYNTAX> エラーが返されます。先行のゼロと数字の小数部は無視され、整数部のみ使用されます。length は整数に解決される変数あるいは式として指定できます。
READ a#1 と READ *a は両方とも、単一文字を入力するために使用されることに注意してください。しかし、variable に格納されている値は異なります。a#1 は入力文字を変数 a に格納します。*a は入力文字の ASCII 数値を変数 a に格納します。両方とも入力文字を $ZB 特殊変数に格納します。これら 2 種類の単一文字入力は、ターミネータ文字の処理方法や、タイムアウトの処理方法でも異なります。
timeout
要求の成功を待機する時間を指定します。この引数はオプションですが、指定される場合、先頭のコロンは必須です。timeout は整数、または整数に評価される式として指定されなければなりません。timeout 引数は、以下のように $TEST 特殊変数を設定します。
-
timeout 引数を持つ READ が正常に終了する (タイムアウトしない) : $TEST は 1 (TRUE) に設定されます。
-
timeout 引数を持つ READ がタイムアウトになる : $TEST は 0 (FALSE) に設定されます。
-
timeout 引数を持たないREAD です。$TEST は、以前の値のままになります。
$TEST は、ユーザが設定することもできます。また、LOCK、OPEN、または JOB のタイムアウトで設定されることもあります。
READ が完了する前にタイムアウトになり、文字の一部が入力された場合 (可変長、または固定長読み取り)、入力文字は variable に格納されます。文字が何も入力されない場合 (可変長、または固定長読み取り)、InterSystems IRIS は variable を (必要な場合は) 定義し、NULL 文字列に設定します。文字が単一文字 READ に対して入力されない場合、InterSystems IRIS は variable を (必要な場合は) 定義し、-1 に設定します。
例
以下の例は、可変長形式の READ を使用して、ユーザから任意の文字列を受け取ります。形式制御 ! によって、プロンプトは新しい行に表示されます。
READ !,"Enter your last name: ",lname
以下の例は、単一文字形式の READ を使用して、ユーザから 1 文字を受け取り、それを ASCII コードを表す数値として格納します。
READ !,"Enter option number (1,2,3,4): ",*opt
WRITE !,"ASCII value input=",opt
WRITE !,"Character input=",$KEY
以下の例は、固定長形式の READ を使用して、ユーザから 3 文字だけを受け取ります。
READ !,"Enter your 3-digit area code: ",area#3
以下は、12 文字までの固定長の名前 (gname)、固定長 (1 文字) のミドル・イニシャル (iname)、任意の長さの姓 (fname) という 3 種類の名前の例です。gname 変数と iname 変数は、10 秒後にタイムアウトになるようにコード化されています。
READ "Given name:",gname#12:10,!,
"Middle initial:",iname#1:10,!,
"Family name:",fname
WRITE $TEST
読み取り処理がタイムアウトすると、READ コマンドは次の読み取り処理を開始します。最初の 2 つの読み取り処理は、タイムアウトするかどうかにかかわらず $TEST を設定します。3 番目の読み取り処理は $TEST を設定しないので、この例の $TEST の値は 2 番目の読み取り処理の結果 (成功かタイムアウト) を反映します。
以下の例は、間接指定を使用して READ コマンドに関連付けられたプロンプトを動的に変更します。
PromptChoice
READ "Type 1 for numbers or 2 for names:",p,#!!!!
IF p'=1,p'=2 {WRITE !,"Invalid input" RETURN }
ELSE {DO DataInput(p) }
DataInput(dtype)
SET MESS(1)="""ENTER A NUMBER:"""
SET MESS(2)="""ENTER A NAME:"""
SET x=1
READ !,@MESS(dtype),val(x)
IF val(x)="" {WRITE !,"Goodbye" RETURN
}
ELSE {
IF dtype=1,1=$ISVALIDNUM(val(x)) { WRITE !,"You input number: ",val(x),! }
ELSEIF dtype=2 { WRITE !,"You input string: ",val(x),! }
ELSE { WRITE !,"That is not a number",! }
SET x=x+1
DO DataInput(dtype)
}
以下の例は、入力された最初の数値の桁数を基にして、固定長読み取りの長さを設定します。
FirstNum
READ "ENTER LARGEST INTEGER (and press Return): ",val(1)
SET ibuf=$LENGTH(val(1))
WRITE !,"Your largest number is: ",val(1),!
DO OtherNums(ibuf)
OtherNums(digits)
SET x=2
READ !,"ENTER NEXT INTEGER: ",val(x)#digits
IF val(x)="" { WRITE !,"Goodbye" RETURN }
ELSEIF val(x)>val(1) { WRITE !,"Number is too big",!
DO OtherNums(digits) }
ELSE { WRITE !,"You input: ",val(x),!
SET x=x+1
DO OtherNums(digits) }
READ は現在のデバイスを使用する
READ は現在の入出力デバイスから文字指向のデータを入力します。ユーザは OPEN コマンドを使用してデバイスを開き、USE コマンドを使用してそのデバイスを現在のデバイスとして設定する必要があります。InterSystems IRIS は、現在のデバイス ID を $IO 特殊変数で管理します。
READ が最もよく使用されるのは、キーボードからユーザ入力を取得する場合ですが、シーケンシャル・ディスク・ファイル、または通信バッファなどのバイト指向のデバイスから文字を入力するためにも使用できます。
行呼び出し
行呼び出しモードを使用すると、ターミナル・デバイス上の READ コマンドは、前に入力された行を入力として受け取ることができます。この呼び出された入力行は、その後編集できます。ユーザは、ユーザ指定の入力を終結するのと同じ方法で、呼び出された行の入力をインタラクティブに終了する必要があります。InterSystems IRIS は、可変長ターミナル読み取り (READ variable) と固定長ターミナル読み取り (READ variable#length) の両方で、行呼び出しをサポートしています。InterSystems IRIS は、単一文字ターミナル読み取り (READ *variable) では行呼び出しをサポートしていません。現在のプロセスの行呼び出しをアクティブにするには、%SYSTEM.ProcessOpens in a new tab クラスの LineRecall()Opens in a new tab メソッドを使用します。システム全体の行呼び出しを既定に設定するには、Config.MiscellaneousOpens in a new tab クラスの LineRecallOpens in a new tab プロパティを使用します。"ターミナル入出力" の説明に従って、ターミナルの OPEN プロトコルおよび USE プロトコルを設定することもできます。
READ ターミネータ
InterSystems IRIS は、指定された長さに入力文字列が達したときに読み取り処理を終了します (単一文字 READ および固定長 READ の場合)。可変長 READ の場合、InterSystems IRIS は、入力文字列が現在のプロセスの最大長に達したときに読み取り処理を終了します。
InterSystems IRIS は、特定のターミネータ文字に遭遇した場合にも、読み取りを終了します。ターミネータ文字は、デバイスの種類によって異なります。例えば端末では、既定のターミネータは RETURN (一般的には [Enter] キー)、LINE FEED (ASCII 10) および ESCAPE (ASCII 27) です。
デバイスに対して OPEN コマンドや USE コマンドを実行するとき、既定のターミネータを変更することができます。OPEN や USE を使用して、ターミネータ・パラメータ値を指定することができます。ターミナルの OPEN プロトコルおよび USE プロトコルについては、"ターミナル入出力" を参照してください。
-
可変長 READ : InterSystems IRIS は、入力ターミネータを入力値と共に格納せず、$KEY 特殊変数と $ZB 特殊変数に記録します。
-
固定長複数文字 READ : InterSystems IRIS は、入力ターミネータを入力値と共に格納せず、$KEY 特殊変数と $ZB 特殊変数に記録します。
-
単一文字 READ : InterSystems IRIS は、入力ターミネータ (指定されている場合) を単一文字読み取りの入力値として格納します。また、入力ターミネータを $KEY 特殊変数と $ZB 特殊変数にも記録します。
$KEY 特殊変数と $ZB 特殊変数はターミナルからコマンド行を読み取るたびに設定されるため、前の READ コマンドで設定された $KEY 値と $ZB 値は上書きされることに注意してください。
タイムアウトと $ZA、$ZB、および $TEST 特殊変数
InterSystems IRIS は以下のように、$TEST、$ZA、および $ZB の特殊変数で READ の完了状況を記録します。
READ の種類 | 変数データ | $TEST 値 | $ZA 値 | $ZB 値 |
---|---|---|---|---|
可変長 : 改行で終了 | 入力文字 (ない場合は NULL 文字列) | 1 | 0 | ターミネータ文字 |
可変長 : 入力後にタイムアウト | 入力文字 | 0 | 2 | NULL 文字列 |
可変長 : 入力なしでタイムアウト | NULL 文字列 | 0 | 2 | NULL 文字列 |
固定長 : すべての文字を入力 | 入力文字 | 1 | 0 | 入力された最後の文字 |
固定長 : 改行 | 入力文字 (ない場合は NULL 文字列) | 1 | 0 | ターミネータ文字 |
固定長 : タイムアウト | 入力文字 (ない場合は NULL 文字列) | 0 | 2 | NULL 文字列 |
単一文字 : データ入力 | 入力文字の ASCII 値 | 1 | 0 | 入力文字 |
単一文字 : ターミネータ文字を入力 | ターミネータ文字の ASCII 値 | 1 | 0 <Enter>, 256 <Esc> | ターミネータ文字 |
単一文字 : タイムアウト | -1 | 0 | 2 | NULL 文字列 |
$ZB と $KEY
$ZB と $KEY 特殊変数は、すべての種類の読み取りに対してまったく同じ値を返しますが、1 つ例外があります。固定長読み取りを実行し、指定された文字数を入力するとき、READ はターミネータなしで終了します。この場合、$ZB は入力された最後の文字 (終了文字) を含み、$KEY は NULL 文字列を含みます (ターミネータ文字はありません)。
中断
READ の呼び出し時に保留中の CTRL-C 中断が存在する場合、READ は、ターミナルからの読み取り前にこの中断を破棄します。
処理中の読み取りが CTRL-C 中断によって中断される場合、variable は前の状態に戻ります。例えば、読み取り処理に複数の文字を入力し、CTRL-C で中断した場合、variable は読み取り処理前の状態に戻ります。つまり、未定義の場合は未定義のまま、以前に何か値を持つ場合は、その前の値を含むということです。この振る舞いは、タイムアウトになる読み取り処理とは完全に異なります。読み取りのタイムアウトには、タイムアウトになる前に入力された文字を含む、variable の新規の状態が保持されます。READ コマンドが複数の読み取り処理を含む場合、実行中の読み取り処理だけが中断の影響を受けます。複数の読み取り処理を 1 つのユニットとして実行、または戻すには、トランザクション処理を使用します。
CTRL-C 中断の有効化および無効化については、"中断を有効または無効にする BREAK フラグ" および "$ZJOB" 特殊変数を参照してください。
キーボード以外のデバイスからの入力を受け取る READ を実行する
前述したように、READ は、すべての文字指向のデバイスからの入力の取得に使用できます。この中には、シーケンシャル・ディスク・ファイルや端末キーボードなどのデバイスも含まれます。しかし最初に、OPEN コマンドや USE コマンドを使用して、読み取りに使用するデバイスを現在のデバイスとして設定する必要があります。
キーボード以外のデバイスの場合、可変長、単一文字、固定長の 3 つの入力形式のいずれも使用できます。特定の状況でどの形式を選択するかは、利用できるターミネータの種類によって異なります。
例えば、行指向の形式のデータに、行のターミネータとして、CARRIAGE RETURN/LINE FEED が含まれているデバイスから読み取る場合は、可変長フォームを使用できます。この場合、InterSystems IRIS は各行をそのまま全部 variable に読み取ります。入力を終了するのは、行末の [Return] (ASCII コード 13) に達したときだけです(前に示したユーザ入力の例を思い出してください。Enter は入力ターミネータです)。
一方、レコードが一連の固定長フィールドで表されているデバイスから読み取りを行う場合は、固定長 (variable#length) 形式を使用します。例えば、4 つのフィールドで構成されている、レコード形式を使用したデバイスを持っているとします。フィールドの最高文字数は、それぞれ 8 文字、12 文字、4 文字、6 文字とします。データを読み取るには、以下のようなコードを使用できます。
READ field1#8,field2#12,field3#4,field4#6
この場合、#n 値が、各フィールドの入力ターミネータを設定します。
特定のデバイスでどのターミネータを使用するかは、OPEN コマンド、または USE コマンドでそのデバイスに指定するデバイス・パラメータによって設定できます。
ブロック型のデータを読み取るとき、$ZB 特殊変数は入出力バッファに残るバイトを含みます。この関数は、文字指向のデータを読み取るときに使用する方法とは完全に異なります。$ZB は読み取りターミネータ文字や、ブロック型入出力中に最後に入力された文字などを含みません。詳細は "$ZB" を参照してください。
印字不能文字の読み取り
印字不能文字とは、ASCII 印字可能文字の標準範囲外の文字を指します。つまり、ASCII コードの ASCII 32 より小さいか、ASCII 127 より大きい文字ということです。これらの文字と対応する単独のキーは、標準のキーボードにはありません。
ASCII コードが ASCII 32 より小さい文字は、通常、制御操作に使用されます。これらは、Ctrl キーと組み合わせてのみ入力できます。例えば、ETX (ASCII 3) は、Ctrl-C として入力されます。キーボードから入力されるときは、BREAK をアサートするために使用されます。
コードが ASCII 127 より大きい文字は、通常、グラフィック操作に使用されます。原則として、これらの文字はキーボードからは入力できませんが、他の種類のデバイスから読み取りできます。例えば、ASCII 179 は、垂直線を表す文字を生成します。
READ コマンドを使用すると、標準の ASCII 印字可能文字と同じように、印字不能文字を入力できます。ただし、このような文字それぞれで使用される、エスケープ・シーケンスを処理するコードを含む必要があります。エスケープ・シーケンスは、Esc 文字 (ASCII 27) から始まる文字シーケンスです。例えば、有効な入力応答として、ユーザがファンクション・キーを押すことができるようにする READ コードを記述することができます。ファンクション・キーを押すと、エスケープ・シーケンスが生成されます。エスケープ・シーケンスは端末の種類ごとに異なります。
ObjectScript は、エスケープ・シーケンスを指定 variable ではなく、$ZB や $KEY 特殊変数に保存することで、エスケープ・シーケンスの入力をサポートします。例えば、ファンクション・キーが押された場合、InterSystems IRIS は Esc コード (ASCII 27) を $ZB と $KEY に保存します。エスケープ・シーケンスを処理するには、各 READ の後の $ZB や $KEY の現在の値をテストするコードを含める必要があります。これは、後続のコードがこれらの特殊変数を更新し、以前の値をすべて上書きするからです $ZB と $KEY は類似していますが、まったく同じものではありません。詳細は、"$KEY" を参照してください)。エスケープ・シーケンスなどの印字不能文字を表示するには、ZZDUMP コマンド、または $ASCII 関数を使用します。
シーケンシャル・ファイルの最後
シーケンシャル・ファイルの最後に到達したときの READ の振る舞いは、システム全体の既定によって異なります。管理ポータルに進み、[システム管理]、[構成]、[追加の設定]、[互換性] の順に選択します。SetZEOF の現在の設定を表示して編集します。このオプションは、シーケンシャル・ファイルの読み込み時に InterSystems IRIS が予期しないファイル終端に到達したときの振る舞いを決めます。“true” に設定すると、InterSystems IRIS は、ファイルの最後に到達したことを示す $ZEOF 特殊変数を設定します。“false” に設定すると、InterSystems IRIS は <ENDOFFILE> エラーを発行します。既定は “false” です。
現在のプロセスに対して、このファイルの最後に到達したときの動作を変更するには、%SYSTEM.ProcessOpens in a new tab クラスの SetZEOF()Opens in a new tab メソッドを使用します。システム全体に対して、ファイルの最後に到達したときの既定の動作を設定するには、Config.MiscellaneousOpens in a new tab クラスの SetZEOFOpens in a new tab プロパティを使用します。