[ 前のページ ]
[ 次のページ ]
[ 目次 ]
[ 索引 ]
[ DOC Home ]
シンボルは,数値,文字,論理値(真または偽など)を表す名前です。DCL コマンド行でシンボルを使用すると,DCLは,シンボルを対応する値に置き換えてからコマンドを実行します。
本章では,次のことについて説明します。
その他の情報については,次のマニュアルを参照してください。
シンボルは,次のように使用できます。
シンボルは,式の中の変数として使用したり,コマンド・プロシージャとの間でパラメータを渡すのに使用したりできる。 また,READ, WRITE,INQUIREなどのDCLコマンドは,シンボルを使用してデータ・レコードを表す。
たとえば,頻繁にアクセスするディレクトリに省略時の値を設定するシンボルを作成することができます。 次のコマンドは,省略時の値をWORK1:[JONES.WORK] ディレクトリに設定する WORKシンボルを定義して使用する方法を示しています。
$ WORK :== SET DEFAULT DISK1:[JONES.WORK] $ WORK $ SHOW DEFAULT DISK1:[JONES.WORK]
論理名とシンボルは似ていますが,使用目的は異なります。論理名とシンボルの機能, 用途,その他の性質の違いを次の表に示します。
性質 | 論理名 | シンボル |
---|---|---|
機能 | デバイス,ディレクトリ, ファイル,キュー,その他のシステム・オブジェクトの指定を表す。 | コマンドまたはコマンド文字列の一部を表す。 |
用途 | デバイス,ディレクトリ, ファイル,キュー,その他のシステム・オブジェクトの完全な指定の代わりに使用する。 論理名は,変換のためにファイル・システムに渡すコマンド文字列パラメータの一部として使用しなければならない。 | コマンド文字列の代わりに使用する。シンボルは, コマンド言語インタプリタによって変換されるコマンド文字列の最初の語として使用しなければならない。 |
格納 | プロセス,ジョブ,グループ,またはシステム論理名テーブルに格納される。 第13.10 節を参照。 | グローバル・シンボル・テーブルとローカル・ シンボル・テーブルに格納される。第14.10 節を参照。 |
作成 | 論理名を作成するにはASSIGNコマンドまたはDEFINEコマンドを使用する。 第13.3節を参照。 | シンボルを作成するには割り当て文( =または== ) を使用する。第14.2節を参照。 |
表示 | 論理名を表示するにはSHOW LOGICAL コマンドまたはSHOW TRANSLATIONコマンドを使用する。 第13.6節を参照。 | シンボルを表示するにはSHOW SYMBOLコマンドを使用する。 第14.3節を参照。 |
削除 | 論理名を削除するにはDEASSIGN コマンドを使用する。第13.4節を参照。 | シンボルを削除するにはDELETE /SYMBOLコマンドを使用する。第14.2.5 項を参照。 |
ローカルとグローバルの2つのタイプのシンボルを作成できます。ローカル・ シンボルには,現在のコマンド・レベルから,および現在のコマンド・ レベルで実行されるコマンド・プロシージャからアクセスできます。 グローバル・シンボルには,すべてのコマンド・レベルからアクセスできます。
シンボルは,文字列,数値,レキシカル関数,論理値,別のシンボルを使用して定義できます。 シンボル名の長さは1〜255文字とし,先頭の文字が英字, アンダスコア(_),ドル記号($)でなければなりません。シンボル名の中では, 小文字も大文字もすべて大文字として扱われます。
シンボルを作成するには,割り当て文 (=または==)または文字列割り当て(:= または:==)を使用します。文字列割り当てを使用すると, すべての英字が大文字に変換され,複数のスペースやタブが1つのスペースに圧縮されます。 文字列割り当ては,DCLコマンドを表すシンボルを作成したり, フォーリン・コマンドを定義したりするのに使用できます( いずれの場合も255文字が上限です)。文字列割り当ての中で文字列が2行にわたる場合には, ハイフンを使用します。
READとINQUIREコマンドを使用してもシンボルを作成することができます( 第15章と第16章を参照) 。
次の例では,ローカル・シンボルSSがDCLコマンドSHOW SYMBOLに割り当てられます。
$ SS = "SHOW SYMBOL"
次の例では,ローカル・シンボルDBがDCLコマンドDIRECTORY ACCOUNTS:[BOLIVAR]に割り当てられます。
$ DB := DIRECTORY ACCOUNTS:[BOLIVAR]
次の例では,グローバル・シンボルDCは,DCLコマンド行を表すために使用されています。DCL コマンドDIRECTORYは,シンボル名の入力時に指定の修飾子付きで実行されます。
$ DC == "DIRECTORY/SIZE=ALL DISK1:[JONES.TAX]MONEY.LIS"
次の例では,グローバル・シンボルREADYはDCLコマンド行を表すために使用されています。 このシンボル名を入力すると,DCLのPRINTコマンドが指定された修飾子と一緒に実行されます。
$ READY :== PRINT/CONFIRM/QUEUE=AKI$LN03/NOTIFY/RESTART $ READY FILE.DAT
DCLコマンドを表すシンボルは,ログイン・コマンド・ファイル(LOGIN.COM) で定義することも,DCLレベルで会話形式で定義することもできます。 ログ・コマンド・ファイルでシンボルを定義した場合は,ログインするたびにそのシンボルを使用できますが, シンボルを会話形式で定義した場合は, 現在のプロセスの実行中しかシンボルを使用できません。
DCLコマンドと同じ名前を持つシンボルを定義すると,その定義はDCLコマンド名を無効にします。 たとえば,TYPE HELP.LSTコマンドとしてHELPシンボルを定義すると,HELP を入力しても,システムのヘルプ・ユーティリティを起動できなくなります。
アスタリスク(*)を使用してシンボルを作成すると,シンボルの短縮形を使用できます。 一般に,シンボル定義の短縮形は,シンボルを使用できる状況であればいつでも使用できます。 ただし,部分文字列の置換を含むシンボルは例外です。 詳細は,第14.6.5 項を参照してください。
シンボルを定義する際には,既存のシンボルが新しいシンボルと置き換えられてしまうことがあります。 既存のシンボルがアスタリスクの位置,またはその後まで新しいシンボルと完全に一致する場合には, 既存のシンボルは新しいシンボルに置き換えられます。 また,アスタリスクの位置まで, またはその後まで既存のシンボルと部分的に一致する名前を持つシンボルを新たに定義することはできません。
次の例は,PR,PRI,またはPRINに短縮できるローカル・シンボルPRINTを作成します。
$ PR*INT = "PRINT/CONFIRM/QUEUE=AKI$LN03/NOTIFY/RESTART"
指定された修飾子を付けてDCLのPRINTコマンドを実行するには,シンボルのフルネームかその短縮形を使用します。
DCL以外のイメージのファイル指定をシンボルに定義すると,そのシンボル名でイメージを実行できます。 イメージを実行するシンボルをフォーリン・ コマンドといいます。フォーリン・コマンドは,コマンド・インタプリタがDCL コマンドとして認識しないイメージです。(DCLコマンドのどの要素とも同様に, フォーリン・コマンドの文字数の上限は255文字です。)
シンボルをフォーリン・コマンドとして定義するときの形式は,次のとおりです。
シンボル名:=[=] $イメージ・ファイル指定シンボル名=[=] "$ イメージ・ファイル指定"
シンボル定義冒頭のファイル指定の前のドル記号($)は(ドル記号とファイル指定の間にはスペースはない) ,イメージの実行要求を意味しています。
イメージ・ファイル指定の場合,省略時のデバイスとディレクトリ名はSYS$SYSTEM に,省略時のファイル・タイプはEXEになります。省略時のファイル・ バージョン番号は最も大きいバージョンになります。
フォーリン・コマンドを使用すると,Command Definitionユーティリティによって新しいコマンドを定義することもできます。 詳細は,『OpenVMS Command Definition, Librarian, and Message Utilities Manual』を参照してください。
シンボルを指定せずに,フォーリン・コマンドを自動的に実行する方法もあります。 詳細については,第14.14節を参照してください。
次の例では,グローバル・シンボルPRINTALLは, DISK1:[ACCOUNTS]PRINTALL.EXEイメージを実行するように定義されています。
$ PRINTALL :== $[ACCOUNTS]PRINTALL
コマンド行で,PRINTALLの後にパラメータが付くことがあります。
次の例では,ファイル指定RAT.DATは,PRINTALLで定義されたイメージに渡されるパラメータです。
$ PRINTALL RAT.DAT
コマンド・インタプリタは,一重引用符(')で囲まれたシンボルを検索して, それを変換します。したがって,前に一重引用符が付いたシンボルまたはレキシカル関数を使用してパラメータを指定した場合は, シンボル置換が行われます( 第14.12節を参照) 。それ以外の場合には,コマンド・インタプリタはコマンド行を解析しません。 このため,パラメータを受け取るイメージ側で,コマンド行の 解析または評価を行わなければなりません。
DELETE/SYMBOLコマンドは,シンボルを削除します。グローバル・シンボルを削除するには,/GLOBAL 修飾子を指定します。たとえば,グローバル・ シンボルTEMPを削除するには,次のコマンドを入力します。
$ DELETE/SYMBOL/GLOBAL TEMP
SHOW SYMBOLコマンドは,シンボルの値を表示します。個々のシンボルの値を表示するには,SHOW SYMBOL コマンドの後にシンボルの名前を入力します。 個々のグローバル・シンボルの値を表示するには,/GLOBAL修飾子を指定します。SHOW SYMBOL/ALL コマンドはすべてのローカル・シンボルを,SHOW SYMBOL/ALL/GLOBAL コマンドはすべてのグローバル・シンボルを表示します。
シンボルが整数値を持つ場合,SHOW SYMBOLコマンドは値を10進数,16進数,8 進数で表示することに注意してください。
次の例では,シンボルPRが表示されます。
$ SHOW SYMBOL PR PR*INT = "PRINT/CONFIRM/COPIES=2/QUEUE=DOC$LN03/NOTIFY/RESTART"
次の例では,シンボルTOTALに対して整数値が表示されます。
$ SHOW SYMBOL TOTAL TOTAL = 4 Hex = 00000004 Octal = 00000000004
シンボルを定義しておくと,それを別のシンボルの値として使用することができます。DCL は,シンボルを使用するコンテキストに応じて,シンボルを文字列または数値として解釈します。
次の例では,整数値3をシンボルCOUNTに割り当てています。
$ COUNT = 3
この場合,COUNTの値を別の割り当て文で使用できます。たとえば,COUNT の値が1に加算されます。
$ TOTAL = COUNT + 1
結果の(4)がTOTALシンボルに定義されます。
いくつかのシンボルを連結して長い文字列を作成するには,プラス記号(+) を使用できます。それぞれのシンボル名の前後に一重引用符(')を置けば,2 つ以上のシンボルを連結することもできます。
シンボル置換の要求については,一重引用符(') を参照してください。
次の例では,シンボル"Saturday"と"Sunday"を使用して,シンボル"WEEKEND" が作成されます。
$ DAY1 = "Saturday, " $ DAY2 = "Sunday" $ WEEKEND = DAY1 + DAY2 $ SHOW SYMBOL WEEKEND WEEKEND = "Saturday, Sunday"
次の例では,一重引用符を使用して,シンボルNAMEとTYPEが連結されます。
$ NAME = "MYFILE" $ TYPE = ".DAT" $ PRINT 'NAME''TYPE'
PRINTコマンドは,MYFILE.DATの内容を印刷します。
文字列割り当ての中にローカル・シンボルを指定するには,コロンと等号(:=) を使用します。文字列割り当ての中にグローバル・シンボルを指定するには, コロンと2つの等号(:==)を使用します。どちらのタイプのシンボル( ローカルまたはグローバル)の場合も,シンボルを一重引用符(')で囲みます。 そうしないと,DCLはそれをシンボルとは認識しません。
シンボルに空の文字列を定義すると,次の例に示すように,そのシンボルは0 の値を持つようになります。
次の例は,文字列割り当て文にの中にCOUNTシンボルを指定しています。
$ BARK := P'COUNT'
前の例では,COUNTに整数値3を割り当てています。この例では,COUNTは文字列値に変換され, 文字Pに追加されます。このとき,ローカル・シンボルBARK はP3と同じ値を持っています。
次の例では,シンボルAはヌルです。
$ A = "" $ B = 2 $ C = A + B $ SHOW SYMBOL C C = 2 Hex = 00000002 Octal = 00000000002
シンボルは,コマンド・プロシージャの中の変数として使用できます。変数には, リテラル値以外のものとして計算したり割り当てたりする値が入ります。 たとえば,レキシカル関数の値を変数に割り当てたり,ファイル・ レコードの値を変数に読み込んだりすることができます。
式は,値が組み合わされたものです。コマンド・プロシージャの中では, 式は,シンボル割り当て文(等号の右辺),IF文,WRITEコマンドの中で, あるいはレキシカル関数の引数として使用されます。
シンボル定義では,割り当て文の左辺がシンボル名,右辺が式になります。 式の中のそれぞれの値(オペランドとも呼びます) は,演算子によって別の値に接続できます。DCLは式を評価して, その結果をシンボルに割り当てます。式が文字列として評価された場合は, シンボルは文字列値を持ちます。
次の例では,ローカル・シンボルBARKが,3つの数値を加算する式として定義されています。
$ BARK = 1 + 2 + 3
オペランドは1,2,および3です。演算子はプラス記号(+)です。前の例では, 評価された式が整数なので,シンボルは整数値を持ちます。
文字列には,印刷可能な文字が入ります。付録 B に,文字列に指定できるASCII文字セットと DEC Multinational 文字セットの表があります。これらの表は文字列に含むことのできる文字を示しています。
文字は,次の3つに分類されます。
A〜Zの大文字,a〜zの小文字,1〜9の数字,ドル記号($),アンダスコア(_) ,ハイフン(-)。
表示や印刷が可能な上記以外の文字。感嘆符(!),引用符("),番号記号(#) など。
表示や印刷ができないすべての文字。一般に,印刷不可能な文字は表示や印刷のときには無視されますが, いくつかの印刷不可能な文字は, 次のような制御機能を持ちます。
文字 | 機能 |
---|---|
HT | 次の水平タブで印刷や入力を開始する |
LF | 次の行で印刷や入力を開始する |
FF | 次のページの冒頭で印刷や入力を開始する |
CR | 同一行の最初のスペースで印刷や入力を開始する |
ESC | ターミナル・ エスケープ・シーケンスの開始を示す |
SP | スペースを1つ挿入する |
文字列を引用符(" ")で囲めば,文字列を定義できます。シンボル割り当てを行ったときの英字の大文字/ 小文字とスペースは,この方法で残します。 次の点に注意してください。
引用符で囲まれた文字列の中では,ハイフン継続文字は使用できない。
次の例では,文字列"YES"が引用符で囲まれます。したがって,引用符の内部で定義しなければなりません。
$ PROMPT = "Type ""YES"" or ""NO""" $ SHOW SYMBOL PROMPT PROMPT = "Type "YES" or "NO""
次の例では,文字列が2行に継続されます。
$ HEAD = "MONTHLY REPORT FOR" + - _$ " DECEMBER 1998" $ SHOW SYMBOL HEAD HEAD = "MONTHLY REPORT FOR DECEMBER 1998"
文字列式には,文字列,文字列として評価されるレキシカル関数,文字列値を持つシンボルが入ります。 式の中で文字列を使用する場合には,文字列を引用符(" ") で囲まなければなりません。引用符を使用しないと,文字列はシンボルとして処理されます。
文字列式は,次の値(「文字列オペランド」と呼びます)を組み合わせます。
文字列と数値との間で演算や比較を実行すると,DCLはその文字列を数値に変換します。
文字列オペランドは,後述するように,加算(文字列連結),減算(文字列削減) ,比較,他の文字列との置換を行うことができます。
次の例では,文字列"CAT"は引用符で囲まなければなりません。
$ TEMP = "CAT"
次の例では,TEMPシンボルは文字列"CAT"を表しています。TOPICシンボルは, 文字列"THE"とTEMPシンボルが表す文字列("CAT")を連結します。結果は"THE CAT" となります。
$ TOPIC = "THE" + TEMP
次の例では,シンボルCOUNTはレキシカル関数F$STRING(65)を表します。
$ COUNT = F$STRING(65)
次のような文字列操作を指定できます。
プラス記号は,2つの文字列を連結します。
マイナス記号は,最初の文字列から2番目の文字列を削除します。
2番目の文字列が最初の文字列の中で2回以上生じている場合には,最初の文字列だけが削除されます。
次の例では,プラス記号(+)を使用して,2つの文字列を連結します。
$ COLOR = "light brown" $ WEIGHT = "30 lbs." $ DOG2 = "No tag, " + COLOR + ", " + WEIGHT $ SHOW SYMBOL DOG2 DOG2 = "No tag, light brown, 30 lbs."
次の例では,マイナス記号( - )を使用して,文字列を削除します。
$ SHOW SYMBOL DOG2 DOG2 = "No tag, light brown, 30 lbs." $ DOG2 = DOG2 - ", 30 lbs." $ SHOW SYMBOL DOG2 DOG2 = "No tag, light brown"
2つの文字列を比較する場合,文字列は文字ごとに比較されます。長さの異なる文字列は等しくありません( たとえば,"dogs"は"dog"より大きいとみなされます) 。
比較の際の基準となるのは,文字のASCII値です。この基準のもとでは,0 〜9の数字はA〜Zの英字より小さく,A〜Zの大文字はa〜zの小文字より小さくなります。 次のいずれかの条件が真になると,文字列比較は終了します。
表 14-1に様々な文字列比較のタイプを示します。
比較 | 演算子 | 説明 |
---|---|---|
等しい | .EQS. | 文字列と文字列を比較して, 等しいかどうかを判定する。 |
より大きい,または等しい | .GES. | 文字列と文字列を比較して,最初に指定された文字列の値が2番目の文字列の値より大きいかまたは等しいかを判定する。 |
より大きい | .GTS. | 文字列と文字列を比較して, 最初に指定された文字列の値が2番目の文字列の値より大きいかどうかを判定する。 |
より小さい, または等しい | .LES. | 文字列と文字列を比較して, 最初に指定された文字列の値が2番目の文字列の値より小さいかまたは等しいかを判定する。 |
より小さい | .LTS. | 文字列と文字列を比較して, 最初に指定された文字列の値が2番目の文字列の値より小さいかどうかを判定する。 |
等しくない | .NES. | 1つの文字列を別の文字列と比較して,等しくないかどうかを判定する。 |
これらの例の中では,LAST_NAMEシンボルが"WHITFIELD"の値を持つものとします。
$ TEST_NAME = LAST_NAME .EQS. "Hill" $ SHOW SYMBOL TEST_NAME TEST_NAME = 0 . . .
$ TEST_NAME = LAST_NAME .GES. "HILL" $ SHOW SYMBOL TEST_NAME TEST_NAME = 1 . . .
$ TEST_NAME = LAST_NAME .GTS. "HILL" $ SHOW SYMBOL TEST_NAME TEST_NAME = 1 . . .
$ TEST_NAME = LAST_NAME .LES. "HILL" $ SHOW SYMBOL TEST_NAME TEST_NAME = 0 . . .
$ TEST_NAME = LAST_NAME .LTS. "HILL" $ SHOW SYMBOL TEST_NAME TEST_NAME = 0 . . .
$ TEST_NAME = LAST_NAME .NES. "HILL" $ SHOW SYMBOL TEST_NAME TEST_NAME = 1 . . .
置換文字列の位置とサイズを指定すると,文字列の一部だけを別の文字列に置き換えることができます。 この場合の形式は次のとおりです。
ローカル・シンボルの場合は,
シンボル名[オフセット,サイズ] :=置換文字列
グローバル・シンボルの場合は,
シンボル名[オフセット,サイズ] :==置換文字列
各要素は次のとおりです。
オフセット | 元の文字列の最初の文字を基準として置換文字列の位置を示す整数である。 オフセット0はシンボルの最初の文字を意味し, オフセット1は2番目の文字を意味する。 |
サイズ | 置換文字列の長さを示す整数である。 |
部分文字列を置換する場合には,次の規則に従います。
レコードを一列に並べれば,リストが読みやすくなり,ソートしやすくなります。 この形式を使用して,データの格納方法を指定できます。
次の例では,最初の割り当て文はAというシンボルにPACKRATの値を割り当てています。2 番目の割り当て文は,MUSKをAの値の中の最初の4文字に置き換えることを指定しています。 この結果,Aの値はMUSKRATになります。
$ A := PACKRAT $ A[0,4] := MUSK $ SHOW SYMBOL A A = "MUSKRAT"
次の例では,シンボルBが以前に値を持っていない場合には,4つのスペースの後にRAT を付けた値が与えられます。
$ B[4,3] := RAT
次の例では,80個のブランクからなる値をLINEシンボルに割り当てています。
$ LINE[0,80]:= " "
次の例では,最初の文は,DATAの最初の15桁にNAMEの値を埋め込みます。 2番目の文は,18桁目にGRADEの値を埋め込みます。16桁目と17桁目はブランクになります。
$ DATA[0,15] := 'NAME' $ DATA[17,1] := 'GRADE'
数値は次のいずれかの値になります。
シンボルに割り当てる数値は,-2147483648〜2147483647 (10進数)の範囲でなければなりません。 この範囲にない数値を指定した場合や,この範囲にない数値が計算で得られた場合には, エラーは報告されませんが,結果は間違った値になります。
DCLコマンド・レベルとコマンド・プロシージャの中では,数値は次のように指定します。
正の整数は,該当する数字を入力することによって指定します。
負の整数には前にマイナス記号(-)を付けます。
10進数以外の基数を指定するには,16進数の場合には%Xを,8進数の場合には%0 を数値の前(ただし,マイナス記号の後)に付けます。
数値には小数点を含めることができません。計算のときには,小数点は切り捨てられます。 たとえば,8を3で除算すると2になります。
次の例では,13という数値をDOG_COUNTというシンボルに割り当てています。
$ DOG_COUNT = 13 $ SHOW SYMBOL DOG_COUNT DOG_COUNT = 13 Hex = 0000000D Octal = 00000000015
次の例では,負の値( -15237 )がマイナス記号( - )によって表現されます。
$ BALANCE = -15237 $ SHOW SYMBOL BALANCE BALANCE = -15237 Hex = FFFFC47B Octal = 37777742173
次の例では,16進数Dが%Xという接頭語によって表現されます。
$ DOG_COUNT = %XD $ SHOW SYMBOL DOG_COUNT DOG_COUNT = 13 Hex = 0000000D Octal = 00000000015 $ BALANCE = -%X3B85 $ SHOW SYMBOL BALANCE BALANCE = -15237 Hex = FFFFC47B Octal = 37777742173
数値は,内部的には符号付きの4バイト整数,すなわちロングワードとして格納されます。 正の整数は0〜2147483647の値に,負の整数は4294967296 から数値の絶対値を引いた値になります。たとえば,-15237 という数値は4294952059として格納されます。負の整数は,ASCIIや10進数で表示する場合には, マイナス記号形式に変換されますが,16進数や8 進数で表示する場合には,マイナス記号形式には変換されません。たとえば,-15237 という数値は,16進数の-00003B85ではなく,16進数のFFFFC47B (10 進数4294952059)として表示されます。
数値は,ASCII表記規則を使用して一連の数字としてテキスト・ファイルに格納されます( たとえば,数値の1は49として格納されます)。
数値式では,値はリテラル数(3など)または数値を持つシンボルでなければなりません。 また,数値を表す文字列(たとえば,"23"または"-51") を使用できます。数値と文字列の間で演算を行ったり比較したりする場合, 文字列は数値に変換されます。
数値式は,次の値(整数オペランドと呼ばれます)を組み合わせます。
$ COUNT = 1
$ B = F$INTEGER("-9" + 23)
$ A = B - 6
前の例では,BというシンボルはF$INTEGER関数(-923)によって戻された整数値を表します。
このような整数オペランドは,後述するように,算術演算子,論理演算子, 比較演算子によって接続できます。
次のような算術演算を指定できます。
アスタリスク(*)は,2つの数値を乗算します。
スラッシュ(/)は,最初に指定された数値を2番目に指定された数値で除算します。 数値が割り切れない場合には,余りは切り捨てられ,四捨五入は行われません。
プラス記号(+)は,2つの数値を加算します。
マイナス記号(-)は,最初に指定された数値から2番目に指定された数値を減算します。
プラス記号とマイナス記号は,後に続く数値の符号を変更します。
$ BALANCE = 142 * 14 $ SHOW SYMBOL BALANCE BALANCE = 1988 Hex = 000007C4 Octal = 00000003704
$ BALANCE = BALANCE / 14 $ SHOW SYMBOL BALANCE BALANCE = 142 Hex = 0000008E Octal = 00000000216
$ BALANCE = BALANCE + 37 $ SHOW SYMBOL BALANCE BALANCE = 179 Hex = 000000B3 Octal = 00000000263
$ BALANCE = BALANCE - 15416 $ SHOW SYMBOL BALANCE BALANCE = -15237 Hex = FFFFC47B Octal = 00000142173
$ BALANCE = -(- a142) $ SHOW SYMBOL BALANCE BALANCE = 142 Hex = 0000008E Octal = 00000000216
表 14-2は,数値比較のタイプの一覧です。
比較 | 演算子 | 説明 |
---|---|---|
等しい | .EQ. | 数値と数値を比較して, 等しいかどうかを判定する。 |
より大きい,または等しい | .GE. | 数値と数値を比較して,最初の数値が2番目の数値より大きいか,または等しいかどうかを判定する。 |
より大きい | .GT. | 数値と数値を比較して,最初の数値が2 番目の数値より大きいかどうかを判定する。 |
より小さい,または等しい | .LE. | 数値と数値を比較して,最初の数値が2番目の数値より小さいか, または等しいかを判定する。 |
より小さい | .LT. | 数値と数値を比較して,最初の数値が2 番目の数値より小さいかどうかを判定する。 |
等しくない | .NE. | 数値と数値を比較して, 等しくないかどうかを判定する。 |
ここに示す例では,BALANCEシンボルが-15237の値を持つと想定しています。
$ TEST_BALANCE = BALANCE .EQ. -15237 $ SHOW SYMBOL TEST_BALANCE TEST_BALANCE = 1 . . .
$ TEST_BALANCE = BALANCE .GE. -15237 $ SHOW SYMBOL TEST_BALANCE TEST_BALANCE = 1 . . .
$ TEST_BALANCE = BALANCE .GT. -15237 $ SHOW SYMBOL TEST_BALANCE TEST_BALANCE = 0 . . .
$ TEST_BALANCE = BALANCE .LE. -15237 $ SHOW SYMBOL TEST_BALANCE TEST_BALANCE = 1 . . .
$ TEST_BALANCE = BALANCE .LT. -15237 $ SHOW SYMBOL TEST_BALANCE TEST_BALANCE = 0 . . .
$ TEST_BALANCE = BALANCE .NE. -15237 $ SHOW SYMBOL TEST_BALANCE TEST_BALANCE = 0 . . .
特殊な形式の割り当て文を使用すれば,現在のシンボル値のバイナリ・ (ビット・レベル)オーバレイを実行できます。
ローカル・シンボルの場合は,
シンボル名[ビット位置,サイズ] =置換式
グローバル・シンボルの場合は,
シンボル名[ビット位置,サイズ] ==置換式
各要素は次のとおりです。
ビット位置 | オーバレイを実行するビット0 からの相対位置を示す整数である。 |
サイズ | オーバレイするビット数を示す整数である。 |
数値オーバレイを使用するには,次の規則に従います。
次の例は,BELLシンボルを7の値に定義しています。BELLの下位バイトは00000111 というバイナリ値です。ここで,このバイナリ値のオフセット5 の位置の0を1に変更すれば(ビットは,右から左に0から順にカウントされます) ,00100111 (10進数39)というバイナリ値が得られます。
$ BELL = 7 $ BELL[5,1] = 1 $ SHOW SYMBOL BELL BELL = 39 Hex = 00000027 Octal = 00000000047
これ以降の節では,論理値と式の使用について説明します。
一部の演算では,数値と文字列を次のような値を持つ論理データとして解釈します。
数値が奇数の場合(すなわち,下位バイトが1の場合)には,その数値の論理値は真となります。 文字列の場合は,最初の文字が大文字または小文字のT またはYのときに,その文字列の論理値は真となります。
数値が偶数の場合(すなわち,下位バイトが0の場合)には,その数値の論理値は偽となります。 文字列の場合は,最初の文字が大文字または小文字のT またはYでないときに,その文字列の論理値は偽となります。
次の例では,DOG_COUNTに13という値が割り当てられています。IF STATUS は,論理値STATUSが真であることを意味します。
$ STATUS = 1 $ IF STATUS THEN DOG_COUNT = 13
$ STATUS = "TRUE" $ IF STATUS THEN DOG_COUNT = 13
論理演算は,演算の対象となる数値のすべてのビットに影響します。 論理式の値は整数であり,式の結果も整数になります。 論理式で文字列値を指定すると,文字列が整数に変換されてから,式の評価が行われます。
通常は,論理式を使用して,論理値の下位ビットを評価します。すなわち, 値が真か偽かを判断します。次の論理演算を指定できます。
.NOT.演算子は,論理値のビット構成を反転します。真の値は偽となり, 偽の値は真となります。
.AND.演算子は,次に示すように,2つの論理値の論理積を求めます。
ビット・レベル | 要素レベル |
---|---|
1 .AND. 1 = 1 | 真.AND.真 = 真 |
1 .AND. 0 = 0 | 真.AND.偽 = 偽 |
0 .AND. 1 = 0 | 偽.AND.真 = 偽 |
0 .AND. 0 = 0 | 偽.AND.偽 = 偽 |
.OR.演算子は,次に示すように,2つの論理値の論理和を求めます。
ビット・レベル | 要素レベル |
---|---|
1 .OR. 1 = 1 | 真.OR.真 = 真 |
1 .OR. 0 = 1 | 真.OR.偽 = 真 |
0 .OR. 1 = 1 | 偽.OR.真 = 真 |
0 .OR. 0 = 0 | 偽.OR. 偽 = 偽 |
次の例は,真の値を偽に反転させます。式の評価は-2で,この値は偶数であるため, 結果は偽となります。
$ SHOW SYMBOL STATUS STATUS = 1 Hex = 00000001 Octal = 00000000001 $ STATUS = .NOT. STATUS $ SHOW SYMBOL STATUS STATUS = -2 Hex = FFFFFFFE Octal = 37777777776
次の例では,真の値と偽の値の論理積を求めた結果が偽の値になっています。
$ STAT1 = "TRUE" $ STAT2 = "FALSE" $ STATUS = STAT1 .AND. STAT2 $ SHOW SYMBOL STATUS STATUS = 0 Hex = 00000000 Octal = 00000000000
次の例は,真の値と偽の値の論理和を求めることによって,結果は真の値になっています。
$ STAT1 = "TRUE" $ STAT2 = "FALSE" $ STATUS = STAT1 .OR. STAT2 $ SHOW SYMBOL STATUS STATUS = 1 Hex = 00000001 Octal = 00000000001
次の表は,ビット単位と数値単位の論理演算の結果を示しています。論理演算では, 大文字または小文字のTまたはYで始まる文字列は数値1として処理され, これ以外の文字で始まる文字列は,数値0として処理されます。 また,奇数は真になり,偶数とゼロは偽になります。
指定された: | 結果: | ||||
---|---|---|---|---|---|
ビットA | ビットB | .NOT. A | A .AND. B | A .OR. B | |
1 | 1 | 0 | 1 | 1 | |
1 | 0 | 0 | 0 | 1 | |
0 | 1 | 1 | 0 | 1 | |
0 | 0 | 1 | 0 | 0 |
指定された: | 結果: | ||||
---|---|---|---|---|---|
数値A | 数値B | .NOT. A | A .AND. B | A .OR. B | |
奇数 | 奇数 | 偶数 | 奇数 | 奇数 | |
奇数 | 偶数 | 偶数 | 偶数 | 奇数 | |
偶数 | 奇数 | 奇数 | 偶数 | 奇数 | |
偶数 | 偶数 | 奇数 | 偶数 | 偶数 |
レキシカル関数は,通常コマンド・プロシージャの中で使用され,システム・ プロセス,バッチ・キューと印刷キュー,ユーザ・プロセスなどについての情報をシステムから検索します。 レキシカル関数を使用して,文字列を処理したり論理名を変換することもできます。 レキシカル関数をシンボルに割り当てた場合, 実際にはレキシカル関数によって戻される情報( たとえば,数値や文字列)がシンボルに割り当てられます。このとき, DCLレベルでは,DCLのSHOW SYMBOLコマンドでその情報を表示できます。 コマンド・プロシージャの中では,シンボルに格納された情報を後でプロシージャで使用できます。 それぞれのレキシカル関数については,『OpenVMS DCL Dictionary』を参照してください。
レキシカル関数を使用するには,レキシカル関数の名前(先頭にF$が付く) とその引数リストを指定します。次の形式を使用します。
F$関数名(引数[,...])
引数リストは関数名の後に指定し,その間にスペースやタブをいくつでもいれることができます。
レキシカル関数を使用する場合は,次の規則に従います。
レキシカル関数は,文字列,整数,シンボルと同じように使用します。式の中でレキシカル関数を使用すると,DCL は自動的に関数を評価して,関数を戻り値と置き換えます。
次の例では,F$LENGTH関数は,引数BUMBLEBEEとして指定された値の長さを戻します。DCL は,自動的に戻り値(9)を判別し,この値を使用して式を評価します。 したがって,式(9 + 1)の結果は10となり,この値がSUMシンボルに割り当てられます。
$ SUM = F$LENGTH("BUMBLEBEE") + 1 $ SHOW SYMBOL SUM SUM = 10 Hex = 0000000A Octal = 00000000012
各レキシカル関数は,情報を整数または文字列のいずれかとして戻すことに注意してください。 また,レキシカル関数の引数は,整数または文字列式として指定しなければなりません。
たとえば,F$LENGTH関数は,文字列式である引数を必要とし,整数の値を戻します。 前の例で,"BUMBLEBEE"引数は文字列式であり,戻り値(9)は整数です。
レキシカル関数は,シンボルを使用できる場所であればどこでも使用できます。 シンボルを一重引用符で囲んで(第14.12節を参照), シンボル置換を強制しなければならない場所では, レキシカル関数の前後に一重引用符を置いて,レキシカル関数の評価を強制しなければなりません。 レキシカル関数は,他のレキシカル関数の引数値としても使用できます。
F$LENGTH関数に対して引数を指定する,他の方法を以下の例に示します。 それぞれの例では,引数は文字列式です。
$ BUG = "BUMBLEBEE" $ LEN = F$LENGTH(BUG) $ SHOW SYMBOL LEN LEN = 9 Hex = 00000009 Octal = 00000000011
BUGシンボルを引数として使用する場合,前後に引用符は付けません。 レキシカル関数は"BUMBLEBEE"値を自動的にBUGに置換して,長さを判別し,9 の値を戻します。
$ BUG = "BUMBLEBEE" $ LEN = F$LENGTH(BUG) $ SHOW SYMBOL LEN LEN = 9 Hex = 00000009 Octal = 00000000011 $ LEN = F$LENGTH(BUG + "S") $ SHOW SYMBOL LEN LEN = 10 Hex = 0000000A Octal = 00000000012
BUGシンボルは引用符で囲まれていませんが,文字列の"S"は引用符で囲まれています。 引数を評価してからでないと,F$LENGTH関数は長さを判別できません。BUG シンボル("BUMBLEBEE")によって表現される値は"S" 文字列と連結され,結果は"BUMBLEBEES"になっています。 F$LENGTH関数は,"BUMBLEBEES"文字列の長さを判別して,10の値を戻します。
$ LEN = F$LENGTH(F$DIRECTORY()) $ SHOW SYMBOL LEN LEN = 8 Hex = 00000008 Octal = 00000000010
F$DIRECTORYを引数として使用する場合は,前後に引用符を付けません。 関数は自動的に評価されます。F$DIRECTORY関数の結果が戻ってからでないと,F$LENGTH 関数は長さを判別できません。結果が戻ると,F$LENGTH関数は省略時のディレクトリの長さ( 大括弧を含む)を判別します。
式には演算と比較操作をいくつでも指定できます。次の表は,式の中に2 つ以上の演算子がある場合の演算子を評価順にリストしたものです。演算子は, 優先順位の高い順にリストされています。すなわち,上にある演算子ほど先に実行されます。
優先順位 | 演算 |
---|---|
7 | 単項プラス(+)と単項マイナス(-) |
6 | 乗算(*)と除算(/) |
5 | 加算(連結)と減算(削減) |
4 | すべての数値および文字比較 |
3 | 論理NOT演算 |
2 | 論理AND演算 |
1 | 論理OR演算 |
1つの式の中に同じ優先順位を持つ複数の演算子がある場合には,左から右に演算が行われます。 通常の優先順位(演算と比較を評価する順)を変更するには, 最初に実行しようとする演算を括弧で囲みます。括弧をネストすることもできます。
次の例では,括弧があるために,乗算の前に加算が実行されます。括弧がなければ, 乗算を先に実行するため,結果は26になります。括弧はネスト可能です。
$ RESULT = 4 * (6 + 2) $ SHOW SYMBOL RESULT RESULT = 32 Hex = 00000020 Octal = 00000000040
DCLのシンボルの評価結果は,文字列または整数値のいずれかになります。 シンボルのデータ・タイプ(文字または整数)は,現在割り当てられている値のデータ・ タイプによって決まります。データ・タイプは永久的なものではないので, 値のタイプが変更されると,シンボルのタイプも変更されます。
式は,値のタイプと使用する演算子に応じて,整数値になったり文字列値になったりします。
次の例では,ローカル・シンボルNUMには,最初に文字値が割り当てられ, 次に整数式が割り当てられるときに整数値に変換されます。
$ NUM = "ABC" $ NUM = 2 + 5
次の表は,DCLがどのように式を評価するかをまとめたものです。最初の欄には, 式に指定できる値と演算子を示します。2番目の欄は,それぞれの場合に, 式全体の評価結果のタイプを示しています。表の中で, 任意の値は文字列または整数を表しています。
式 | 結果の値タイプ |
---|---|
整数値 | 整数 |
文字列値 | 文字列 |
整数レキシカル関数 | 整数 |
文字列レキシカル関数 | 文字列 |
整数シンボル | 整数 |
文字列シンボル | 文字列 |
+, -,または.NOT.任意の値 | 整数 |
任意の値.AND.または.OR.任意の値 | 整数 |
文字列+または-文字列 | 文字列 |
整数+または-任意の値 | 整数 |
任意の値+または- 整数 | 整数 |
任意の値*または/ 任意の値 | 整数 |
任意の値( 文字列比較)任意の値 | 整数 |
任意の値(数値比較)任意の値 | 整数 |
式の中のオペランドがすべて同じ値のデータ・タイプになっていないと, DCLは式を評価できません。値のタイプには,文字列データ・タイプと整数データ・ タイプがあります。文字列データには,文字列,文字列値を持つシンボル, 文字列値を戻すレキシカル関数があります。整数データには, 整数,整数値を持つシンボル,整数値を戻すレキシカル関数があります。1 つの式に数値オペランドと文字列オペランドの両方が入っている場合には,DCL はすべての文字列を整数に変換するか,すべての整数を文字列に変換します。
一般に,文字列値と整数値の両方を使用すると,文字列値が整数に変換されます。 ただし,DCLが文字列比較を行うときは例外で,この場合には整数が文字列に変換されます。
また,次のレキシカル関数を使用すると,式の値を決定したり変更したりできます。
文字列は,次のようにして整数に変換されます。
次の表は,文字列を整数値を変換する場合を示しています。
文字列 | 結果として生じる整数 |
---|---|
"123" | 123 |
"12XY" | 0 (偽) |
"Test" | 1 (真) |
"hello" | 0 (偽) |
整数を文字列に変換すると,結果として生じる文字列には整数値に対応する数値が入ります。 次の表は,整数を文字列値に変換する場合を示しています。
整数 | 結果として生じる文字列 |
---|---|
123 | "123" |
1 | "1" |
0 | "0" |
シンボルは,オペレーティング・システムによって管理されるローカル・ シンボル・テーブルまたはグローバル・シンボル・テーブルに格納されます。
DCLでは,コマンド・プロシージャの実行時,CALLコマンドの使用時,およびバッチ・ ジョブのキュー登録時にユーザが作成するすべてのコマンド・ レベルとメイン・プロセスに対して1つずつのローカル・シンボル・ テーブルが保持されます。ローカル・シンボルを作成すると,DCLは,そのシンボルを現在のコマンド・ レベルのローカル・シンボル・テーブルに収めます。 コマンド・レベルのローカル・シンボル・テーブルは,そのレベルが続くかぎり存在しますが, 該当コマンド・レベルが終了すると,そのローカル・ シンボル・テーブル(およびその中のすべてのシンボル)も削除されます。 プロセス,コマンド・プロシージャ,バッチ・ジョブについての詳細は, 第18章を参照してください。
ローカル・シンボル・テーブルには,ユーザが定義したローカル・シンボルに加えて,DCL の8つのシンボルが収められます。P1〜P8までのこれらのシンボルは, パラメータをコマンド・プロシージャに渡すときに使用されます。 コマンド・プロシージャに渡されるパラメータは文字列とみなされます。 それ以外の場合,P1〜P8は空の文字列("")として定義され,ローカル・ シンボル・テーブルに格納されます。
DCLでは,1つのプロセスが存在する間,1つのグローバル・シンボル・テーブルだけが保持され, すべてのグローバル・シンボルがそのテーブルに収められます。 グローバル・シンボル・テーブルには,ユーザがアクセスするグローバル・ シンボルに加えて,後述する予備グローバル・シンボルが収められています。 このようなグローバル・シンボルは,使用しているプログラムやコマンド・ プロシージャ,ならびにシステム・コマンドやユーティリティについての状態情報を提供します。
$STATUSは,最も最近実行されたコマンドが戻す条件コードです。シンボル$STATUS はOpenVMSオペレーティング・システムのメッセージ・コードの形式に準拠します。EXIT コマンドにパラメータ値を指定すれば,アプリケーション・ プログラムでグローバル・シンボル$STATUSの値を設定できます。 システムは,$STATUSの値を使用して,どのようなメッセージを表示するか, 次に高いコマンド・レベルで実行を継続するかどうかなどを決定します。$STATUS の下位3ビットの値は,グローバル・シンボル$SEVERITY に収められます。
$SEVERITYは,最も最近実行されたコマンドが戻す条件コードの重大度レベルです。$STATUS の下位3ビットに等しいシンボル$SEVERITYは,次のような値を持ちます。
0 | 警告 |
1 | 成功 |
2 | エラー |
3 | 情報 |
4 | 重大(回復不能な) エラー |
$RESTARTは,システム・クラッシュによる割り込みが生じた後でバッチ・ ジョブが再開された場合にTRUEの値になります。それ以外の場合は, FALSEの値になります。
コマンド・インタプリタはシンボルの値を判別するときに,シンボル・テーブルを次のような順序で検索します。
これ以降の節では,シンボルの値をマスクする方法について説明します。
省略時の設定では,外側のコマンド・プロシージャ・レベルで定義されるすべてのシンボル( グローバルとローカル)は,内側のプロシージャ・レベルにアクセスできます。 ただし,SET SYMBOLコマンドを使用すれば,コマンド・ プロシージャの中のローカル・シンボルまたはグローバル・シンボルを他のコマンド・ プロシージャで定義されたシンボルと区別できます。 SET SYMBOLコマンドは,ローカル・シンボルとグローバル・シンボルの値をマスクします。 したがって,コマンド・プロシージャが別のコマンド・ プロシージャを実行する場合,2番目のプロシージャでSET SYMBOLコマンドを指定すれば, 両方のプロシージャで同じシンボル名を使用できます。
SET SYMBOLコマンドは,DCLがコマンド行を処理する前に,動詞文字列(コマンド行の最初のトークン) をシンボルとして変換しようとするかどうかも制御します。 省略時の設定では,変換を行おうとします。この設定を変更して変換を行わないようにすると, コマンドを起動するときに,コマンド・ プロシージャが外側のプロシージャ・レベル環境によって影響されなくなるので便利です。
シンボルの有効範囲は,ローカル・シンボルとグローバル・ シンボルとでは異なります。プロシージャ・レベルを終了して,前のプロシージャに戻ると, ローカル・シンボルとグローバル・シンボルの両方で, 前のレベルのシンボル有効範囲コンテキストが復元されます。
現在の汎用シンボルの有効範囲状態を表示するには,レキシカル関数F$ENVIRONMENT("SYMBOL_SCOPE") を使用します。現在の動詞の有効範囲状態を表示するには, レキシカル関数F$ENVIRONMENT("VERB_SCOPE")を使用します。
ローカル・シンボルはプロシージャ・レベルによって左右されます。ローカル・ シンボルを外側のプロシージャ・レベルで定義すると,内側のどのプロシージャ・ レベルでもシンボルを読み込むことができます(ただし, シンボルへの書き込みはできません)。外側のプロシージャ・レベルにローカルなシンボルに値を割り当てると, 現在のプロシージャ・レベルで新しいシンボルが作成されます。 ただし,外側のプロシージャ・レベルのシンボルは変更されます。
SET SYMBOL/SCOPE=NOLOCALコマンドを使用すると,外側のプロシージャ・ レベルで定義されたすべてのローカル・シンボルが現在のプロシージャ・ レベルとその内側のプロシージャ・レベルではアクセスできなくなります。 たとえば,プロシージャ・レベル2と4で SET SYMBOL/SCOPE=NOLOCAL を指定すると,次のようになります。
グローバル・シンボルはプロシージャ・レベルに左右されません。現在のグローバル・ シンボルの有効範囲コンテキストがそれ以降のすべてのプロシージャ・ レベルに適用されます。
/SCOPE=NOGLOBAL修飾子を使用すると,/SCOPE=GLOBAL修飾子を指定するか, プロシージャを終了して,グローバル・シンボルがアクセス可能であった前のレベルに戻るまで, すべてのグローバル・シンボルはそれ以降のすべてのコマンドにアクセスできません。 また,/SCOPE=NOGLOBAL修飾子を指定すると,/SCOPE=GLOBAL 修飾子指定するまで,新しいグローバル・ シンボルを作成できなくなります。
コンテキストによっては,英字で始まる文字列がシンボル名またはレキシカル関数として使用されることがあります。 このような場合,DCLはシンボルまたはレキシカル関数をその値と置き換えようとします。 シンボルをその現在の値で置き換えることをシンボル置換といいます。 これ以外のコンテキストでシンボルまたはレキシカル関数を使用する場合には, 置換演算子を使用してシンボル置換を要求しなければなりません。
シンボルやレキシカル関数が次のように使用された場合,DCLはシンボルやレキシカル関数を自動的に評価します。
次の例では,コマンド・インタプリタは,英字で始まる文字列をシンボル名として, 数値または基数演算子(%)で始まる文字列をリテラル数値として使用します。
$ TOTAL = COUNT + 1
$ QUERY = "Have we met before?" $ LEN = F$LENGTH(QUERY) + 5 $ SHOW SYMBOL LEN LEN = 27 Hex = 0000001B Octal = 000033
$ IF A .EQ. B THEN WRITE SYS$OUTPUT "DONE"
$ PDEL = "DELETE SYS$PRINT/ENTRY=" $ PDEL 181
$ BELL = 7 $ BELL[5,1] = 1 $ SHOW SYMBOL BELL BELL = 39 Hex = 00000027 Octal = 00000000047
上記の場所にないシンボルの置換を強制するには,次にようにシンボルを一重引用符(') で囲みます。
$ TYPE 'B'
引用符で囲まれた文字列の中のシンボルの置換を強制するには,そのシンボルの前に2 つの一重引用符(')を付け,シンボルの後に1つの一重引用符(') を付けます。
$ T = "TYPE ''B'"
コマンド行を処理する場合,DCLは次の順序でシンボルをその値に置換します。
一重引用符(二重引用符で囲まれた文字列の場合には,2つの一重引用符) で区切られたすべての文字列を左から右に置換します。前に1つの一重引用符が付いたシンボルは反復変換されますが, 前に2つの一重引用符が付いたシンボルは反復変換されません。
コマンド行の中のそれぞれの値を左から右に評価して,値がコマンドの場合は実行し, 式の場合には評価します。。式の中のシンボルは割り当てられた値と置き換えられますが, この置換は反復されません。
次の例は,DCLがシンボルを置換する順序がどのように影響するかを示しています。 シンボルPN,FILE1,およびNUMは,次のように定義します。
$ PN = "PRINT/NOTIFY" $ FILE1 = "[BOLIVAR]TEST_CASE.TXT" $ NUM = 1
このシンボル定義の場合,次のコマンドは,[BOLIVAR]TEST_CASE.TXTというファイルを印刷します。
$ FILE = "'FILE''NUM''" $ PN 'FILE'
最初のコマンドでは,強制置換によってNUMが1になり,FILE''NUM'はFILE1 になります。SHOW SYMBOL FILEコマンドを入力すると, FILE="'FILE1'"になります。
2番目のコマンドは2つの置換を行います。最初に,'FILE'は'FILE1'に置換されます。 一重引用符(')で囲まれているため,'FILE1'も置換が必要です。 自動置換によってFILE1は[BOLIVAR]TEST_CASE.TXTになります。このファイル名は次に,PN の値であるPRINT/NOTIFYに渡されます。結果は, 次のような文字列になります。
$ PRINT/NOTIFY [BOLIVAR]TEST_CASE.TXT
置換演算子を使用すると,DCLが通常はシンボル置換を行わない場所でのシンボル置換を要求できます。DCL は,次の2つの置換演算子を受け入れます。
この2つの演算子の相違点は,置換が行われる時間です。前に一重引用符が付くシンボルはDCL コマンド処理の第1フェーズで置換され,前にアンパサンドが付くシンボルは第2 フェーズで置換されます。コマンド処理のフェーズについての詳細は, 第14.13節を参照してください。
一重引用符(')は,最もよく使用する置換演算子です。コマンド・パラメータや修飾子の代わりにシンボルを使用する場合に, 一重引用符を使用してシンボル置換を要求します。 一重引用符は,文字列割り当て(:=)文の右辺でシンボル置換を要求するのに使用します。
引用符で囲まれた文字列の中でのシンボル置換を要求するには,シンボル名の前に2 つの一重引用符を置き,シンボル名の後に1つの一重引用符を置きます。
一重引用符を使用してシンボル置換を要求した場合は,置換する値の途中では( ハイフン継続文字を使用して)改行できません。
次の例では,TYPEコマンドは,次にくる文字列がファイル指定を想定するコマンドです。 一重引用符は,LITが評価しなければならないシンボルであることを示しています。 一重引用符を省略すると,DCLはLIT.LIS (LIS は,TYPEコマンドの省略時のファイル・タイプ)というファイルを探します。
$ LIT = "LIGHT.BILLS" $ TYPE 'LIT'
次の例では,NAMEの値が置換されて,FILEはREPORT.DATになります。
$ NAME := REPORT $ FILE := 'NAME'.DAT $ SHOW SYMBOL FILE FILE = "REPORT.DAT"
次の例では,NAMEシンボルの現在の値はFREDです。
$ MESSAGE = "Creating file ''NAME'.DAT"
この場合,MESSAGEは次の値を持ちます。
Creating file FRED.DAT
アンパサンド(&)もコマンド・インタプリタが認識する置換演算子です。 多くの場合,一重引用符とアンパサンドは同じ機能を果たします。アンパサンドは, 一重引用符と一緒に使用して置換の実行順序に影響を及ぼすときの置換演算子として最も効果的です。
シンボルが未定義の場合のコマンド・インタプリタのアクションは, コマンドのコンテキストによって決まります。詳細は,第14.13.5項を参照してください。
最初のコマンドでは,コマンド・インタプリタは,コマンド処理の第1フェーズ( 検索)でNAMEシンボルを現在の値と置き換えます。2番目のコマンドは, コマンド処理の第2フェーズ(解析)で NAMEシンボルを現在の値と置き換えます。 方法は異なっても,結果は同じになります。
$ TYPE 'NAME' $ TYPE &NAME
次の例では,アンパサンドは,一重引用符と一緒に使用されて換の実行順序に影響を及ぼしています。
$ P1 = "FRED.DAT" $ COUNT = 1 $ TYPE &P'COUNT'
最初に,コマンド・インタプリタは一重引用符で囲まれたシンボル('COUNT') を評価します。結果は次のようになります。
TYPE &P1
次に,前にアンパサンドが付いたシンボル(P1)を評価します。結果は次のようになります。
TYPE FRED.DAT
次の例のように,PとCOUNTの両方と一緒に一重引用符を使用したとします。
$ TYPE 'P''COUNT'
コマンド・インタプリタは,左から右に処理を進めてPを評価しようとします。P は定義済みのシンボルではないため,DCLはPに空の値を指定します。 次に,コマンド・インタプリタはCOUNTシンボルを評価します。結果は次のようになります。
TYPE 1
次の例では,AはBの現在の値に等しく定義されています。
$ B = "MYFILE.DAT" $ A = "&B" $ TYPE 'A'
アンパサンド(&)を引用符(" ")の中で使用してもシンボル置換は行われません。 したがって,割り当てを行っても,Bの値は置換されませんが, TYPEコマンドはMYFILE.DATを表示します。これは,コマンド・インタプリタが最初に&B の値をAに置換するからです。コマンド・インタプリタは, 次にMYFILE.DATを&Bシンボルに置換します。Bを再定義すれば,TYPEコマンドの結果はそれに応じて変化します。
アンパサンドを使用するときには,次の規則に従ってください。
コマンド・インタプリタは,シンボル置換を次の3つのフェーズで実行します。
コマンド入力検索では,前に一重引用符が付いたシンボルを左から右に順に評価します。 前に1つの一重引用符が付いたシンボルは,第1フェーズ置換で説明するように, 反復変換されますが, 前に2つの一重引用符が付いたシンボルは反復変換されません。
コマンド解析フェーズでは,次のことを行います。
このフェーズでのシンボル置換は反復されません。
式の評価フェーズでは,次のことが行なわれます。
このフェーズでのシンボル置換は反復されません。
コマンド・インタプリタは,コマンド・プロシージャの中で実行されるコマンドやプログラムが入力データとして読み込んだ行は解析しないことに注意してください。 したがって,このようなデータ行ではシンボル置換を行いません。
AVERAGEプログラムは,SYS$INPUT (コマンド入力ストリーム)から55, 57,9999を読み込みます。これらのデータ行はコマンド・インタプリタによっては読み込まれません。 シンボル名を入力しても評価されません。
$ RUN AVERAGE 55 57 9999
シンボル置換には,繰り返し置換と反復置換があります。
一重引用符(')を使用してシンボル置換を要求すると,コマンド・インタプリタは, コマンド処理の第1フェーズで反復置換を実行します。
ただし,引用符で囲まれた文字列の中にシンボルを指定した場合には,一重引用符を使用する置換は反復されません。
次の例では,置換は反復されます。
$ MAC = "5" $ A = "'MAC'" $ B = 'A' $ SHOW SYMBOL B B = 5 Hex = 00000005 Octal = 00000000005
次の理由から,B = 'A'文の後,Bシンボルの値は5になります。
ただし,Aを引用符で囲まれた文字列の中で指定した場合にはどうなるでしょう。
$ B = "''A'" $ SHOW SYMBOL B B = "'MAC'"
この場合は,Bは'MAC'の値を持ちます。引用符で囲まれた文字列の中では置換は反復されないため, シンボル名Aは一回だけ置換されます。
コマンド・インタプリタが反復置換を自動的に実行するのは,コマンド行に一重引用符がある場合だけです。 場合によっては,コマンド同意語の定義をネストするとよいでしょう。
次の例では,EXECが処理されると,コマンド・インタプリタは置換を一回だけ実行します。
$ MAC = "TYPE A.B" $ EXEC = "'MAC'" $ EXEC
結果は文字列'MAC'になります。MACはコマンドとして認識されないため, エラー・メッセージが出されます。このエラーは,コマンド処理の第1フェーズに置換が実行されない(EXEC 文字列が一重引用符によって区切られていない) ために生じています。第2フェーズでは,EXECがコマンド行の最初の値であるため, 文字列'MAC'がEXECに置き換えられます。この置換は反復されません。 したがって,'MAC'が一重引用符で区切られていても, これ以上置換は行われません。
コマンド同意語EXECを正しく使用するには,次に示すように,EXECを一重引用符で囲みます。
$ 'EXEC'
この場合,コマンド処理の第1フェーズでEXECシンボルが評価されます。 この置換は反復置換であるため,('MAC')も評価され,TYPE A.B文字列が置換されます。
コマンド・インタプリタがコマンドの中の式を解析すると,式の中に指定されたシンボルは一回だけ置換されます。 ただし,式の中に一重引用符またはアンパサンドを使用すれば, 反復置換を強制できます。このようにして反復置換を強制した場合には, 次の点に注意してください。
置換の結果,有効なシンボル名が得られない場合には,コマンドは正しく実行されないことに注意してください。
次の例は,IFコマンドでの反復置換を示しています。
$ P1 = "FRED.DAT" $ COUNT = 1 $ IF P'COUNT' .EQS. "" THEN GOTO END
コマンド・インタプリタはこの行を検索して,COUNTシンボルをその現在の値と置き換えます。 結果は次のようになります。
IF P1 .EQS. "" THEN GOTO END
この文字列には一重引用符がないため,コマンド・インタプリタはこれ以上置換を実行しません。 ただし,IFコマンドを実行すると,シンボル名P1 を自動的に評価して,その現在の値と置き換えます。
次の例では,シンボル名FILENAMEは無効です。
$ FILENAME = "A.B" $ IF 'FILENAME' .NES. "" THEN TYPE 'FILENAME'
コマンド・インタプリタは,FILENAMEシンボルをその現在の値(A.B)に置き換えます。 結果は次のようになります。
IF A.B .NES. "" THEN TYPE A.B
IFコマンドがコマンド行を実行するとき,A.Bは有効なシンボルでないため, エラーになります。このIFコマンドを正しく処理するためには,次のように, 一重引用符を省略します。
$ IF FILENAME .NES. "" THEN TYPE 'FILENAME'
コマンド行でシンボルを使用するときにそのシンボルが未定義の場合には, コマンド・インタプリタは,コンテキストに応じて,エラー・メッセージを表示するか, シンボルを空の文字列と置き換えます。未定義シンボルについては, 次の規則が適用されます。
次の例は,コマンド・インタプリタが前に一重引用符が付いた未定義シンボルをどのように処理するかを示しています。
$ FILE := MYFILE'FILE_TYPE' $ SHOW SYMBOL FILE FILE = "MYFILE" $ PRINT 'FILE'
FILEシンボルが作成されると,FILE_TYPEシンボルがその現在の値と置き換えられます。FILE_TYPE が定義されていない場合は,FILE_TYPEは空の文字列と置き換えられます。 ファイル指定の中にファイル・タイプがないと,PRINT コマンドは省略時のファイル・タイプであるLISを使用します。 したがって,ファイル指定はMYFILE.LISと解釈されます。
次の例では,コマンド処理の第3フェーズで式が評価されます。
$ A = 1 $ C = A + B %DCL-W-UNDSYM, undefined symbol - check validity and spelling
Bシンボルは未定義であるため,コマンド・インタプリタは式を評価できません。
プロシージャに対してシンボルを定義せずに,DCLレベルからコマンド・ プロシージャ(ファイル・タイプ.COM)または実行可能イメージ(ファイル・ タイプ.EXE)を起動することもできます。自動的なフォーリン・コマンドを使用すると,DCL は特定のディレクトリからコマンド・プロシージャまたは実行可能イメージを検索して, それを自動的に実行できます。
DCLシンボルでなく,DCLコマンド・テーブルに登録されていないコマンド動詞を入力すると, 一般に次のメッセージが表示されます。
DCL-W-IVVERB, unrecognized command verb - check validity and spelling
しかし,論理名DCL$PATHが定義されている場合には(およびブランクでない場合には) ,DCLはファイル名に無効動詞が含まれており,省略時のファイル指定としてDCL$PATH:.* が指定されているファイルに対して,RMS $SEARCHを実行します。
DCLが.COMまたは.EXEファイルを検索すると,コマンド行の残りの部分をパラメータとして使用して, そのファイルを自動的に実行します(この動作は,DOS ,UNIX,その他のオペレーティング・システムの PATHオプションによく似ています) 。
次の例では,DCLシンボルSYSGENは必要ありません。DCLはSYS$SYSTEMディレクトリからSYSGEN.EXE を検索します。DCLは,シンボル"SYSGEN"が"$SYS$SYSTEM:SYSGEN" として定義されているかのように動作し,SYSGENイメージをフォーリン・ コマンドとして起動します。
$ SYSGEN %DCL-W-IVVERB, unrecognized command verb - check validity and spelling \SYSGEN\ $ DEFINE DCL$PATH SYS$SYSTEM,SYS$DISK:[]FOO $ SYSGEN SHOW MAXPROCESSCNT Parameter Name Current Default Min. Max. Unit Dynamic -------------- ------- ------- ------- ------- ---- ------- MAXPROCESSCNT 157 32 12 8192 Processes
次の例では,SSは"@SS.COM"として定義しておく必要がありません。これは,DCL がSYS$SYSTEMディレクトリからSS.COMまたはSS.EXEを自動的に検索するからです。 その処理を正しく実行できない場合には,DCLはカレント・ ディレクトリからSS.COMまたはSS.EXEを検索します。
$ TYPE SS.COM $ SHOW SYMBOL/LOCAL/ALL $ EXIT $ SS "This is a parameter" P1 = "This is a parameter" P2 = "" P3 = "" P4 = "" P5 = "" P6 = "" P7 = "" P8 = "" $ SS.EXE "This is a parameter" P1 = ".EXE" P2 = "This is a parameter" P3 = "" P4 = "" P5 = "" P6 = "" P7 = "" P8 = ""
この例では,DCLはSS.COMを検索し,"SS"が"@SS.COM"として定義されているシンボルであるかのように動作します。 コマンド行の残りの部分をパラメータとして解析して, コマンド・プロシージャが起動されます。 "SS.EXE"がイメージSS.EXEを起動するのではなく,2つのパラメータを使用してSS.COM が起動され,最初のパラメータが".EXE"というテキスト文字列であることに注意してください。 これは,OpenVMSオペレーティング・ システムで,コマンドの解析とシンボルの置換が実行される方法と一貫しています。
次のことに注意してください。
DCLは無効動詞をファイル指定として使用し,"DCL$PATH:.*"を省略時のファイル指定として使用して検索を実行するため, 特定のファイルが検索されるような方法で論理名を定義することができる。 たとえば, 論理名FOOを"FOO.EXE"として定義し,DCLプロンプトに対して"FOO" と入力すると,FOO.COMは絶対に起動されず,FOO.EXEだけが起動される。
次の制限事項に注意してください。
$ DEFINE DCL$PATH SYS$SYSTEM,SYS$DISK:[]FOO $ TYPE SHOWME.COM $ SHOW SYMBOL P1 $ EXIT $ SHOWME USERS OpenVMS User Processes at MARCH 2, 1998 01:40 PM Total number of users = 1, number of processes = 11 Username Interactive Subprocess Batch RSMITH 9 2
[ 前のページ ]
[ 次のページ ]
[ 目次 ]
[ 索引 ]
[ DOC Home ]