[ 前のページ ] [ 次のページ ] [ 目次 ] [ 索引 ] [ DOC Home ]

14 DCLによるプログラミング:シンボル,コマンド, 式の定義

シンボルは,数値,文字,論理値(真または偽など)を表す名前です。DCL コマンド行でシンボルを使用すると,DCLは,シンボルを対応する値に置き換えてからコマンドを実行します。

本章では,次のことについて説明します。

その他の情報については,次のマニュアルを参照してください。

14.1 シンボルについて

シンボルは,次のように使用できます。

たとえば,頻繁にアクセスするディレクトリに省略時の値を設定するシンボルを作成することができます。 次のコマンドは,省略時の値をWORK1:[JONES.WORK] ディレクトリに設定する WORKシンボルを定義して使用する方法を示しています。

     $  WORK :== SET DEFAULT DISK1:[JONES.WORK]
     $  WORK
     $  SHOW DEFAULT
        DISK1:[JONES.WORK]

14.1.1 論理名とシンボルの違い

論理名とシンボルは似ていますが,使用目的は異なります。論理名とシンボルの機能, 用途,その他の性質の違いを次の表に示します。

性質 論理名 シンボル
機能 デバイス,ディレクトリ, ファイル,キュー,その他のシステム・オブジェクトの指定を表す。 コマンドまたはコマンド文字列の一部を表す。
用途 デバイス,ディレクトリ, ファイル,キュー,その他のシステム・オブジェクトの完全な指定の代わりに使用する。 論理名は,変換のためにファイル・システムに渡すコマンド文字列パラメータの一部として使用しなければならない。 コマンド文字列の代わりに使用する。シンボルは, コマンド言語インタプリタによって変換されるコマンド文字列の最初の語として使用しなければならない。
格納 プロセス,ジョブ,グループ,またはシステム論理名テーブルに格納される。 第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 項を参照。

14.2 シンボルの使用

ローカルとグローバルの2つのタイプのシンボルを作成できます。ローカル・ シンボルには,現在のコマンド・レベルから,および現在のコマンド・ レベルで実行されるコマンド・プロシージャからアクセスできます。 グローバル・シンボルには,すべてのコマンド・レベルからアクセスできます。

シンボルは,文字列,数値,レキシカル関数,論理値,別のシンボルを使用して定義できます。 シンボル名の長さは1〜255文字とし,先頭の文字が英字, アンダスコア(_),ドル記号($)でなければなりません。シンボル名の中では, 小文字も大文字もすべて大文字として扱われます。

シンボルを作成するには,割り当て文 (=または==)または文字列割り当て(:= または:==)を使用します。文字列割り当てを使用すると, すべての英字が大文字に変換され,複数のスペースやタブが1つのスペースに圧縮されます。 文字列割り当ては,DCLコマンドを表すシンボルを作成したり, フォーリン・コマンドを定義したりするのに使用できます( いずれの場合も255文字が上限です)。文字列割り当ての中で文字列が2行にわたる場合には, ハイフンを使用します。


注意
Extended File Specificationsのある環境で作業をしている場合は,リッチ・テキスト文字セットと他の使用可能なオプションについて, 『OpenVMS Extended File Specificationsの手引き』を参照してください。

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

14.2.1 DCLコマンドを表すシンボルの使用

DCLコマンドを表すシンボルは,ログイン・コマンド・ファイル(LOGIN.COM) で定義することも,DCLレベルで会話形式で定義することもできます。 ログ・コマンド・ファイルでシンボルを定義した場合は,ログインするたびにそのシンボルを使用できますが, シンボルを会話形式で定義した場合は, 現在のプロセスの実行中しかシンボルを使用できません。

DCLコマンドと同じ名前を持つシンボルを定義すると,その定義はDCLコマンド名を無効にします。 たとえば,TYPE HELP.LSTコマンドとしてHELPシンボルを定義すると,HELP を入力しても,システムのヘルプ・ユーティリティを起動できなくなります。

14.2.2 シンボルの短縮

アスタリスク(*)を使用してシンボルを作成すると,シンボルの短縮形を使用できます。 一般に,シンボル定義の短縮形は,シンボルを使用できる状況であればいつでも使用できます。 ただし,部分文字列の置換を含むシンボルは例外です。 詳細は,第14.6.5 項を参照してください。

シンボルを定義する際には,既存のシンボルが新しいシンボルと置き換えられてしまうことがあります。 既存のシンボルがアスタリスクの位置,またはその後まで新しいシンボルと完全に一致する場合には, 既存のシンボルは新しいシンボルに置き換えられます。 また,アスタリスクの位置まで, またはその後まで既存のシンボルと部分的に一致する名前を持つシンボルを新たに定義することはできません。

次の例は,PR,PRI,またはPRINに短縮できるローカル・シンボルPRINTを作成します。

     $ PR*INT = "PRINT/CONFIRM/QUEUE=AKI$LN03/NOTIFY/RESTART"

指定された修飾子を付けてDCLのPRINTコマンドを実行するには,シンボルのフルネームかその短縮形を使用します。

14.2.3 フォーリン・コマンドの定義

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.2.4 シンボルの置換

コマンド・インタプリタは,一重引用符(')で囲まれたシンボルを検索して, それを変換します。したがって,前に一重引用符が付いたシンボルまたはレキシカル関数を使用してパラメータを指定した場合は, シンボル置換が行われます( 第14.12節を参照) 。それ以外の場合には,コマンド・インタプリタはコマンド行を解析しません。 このため,パラメータを受け取るイメージ側で,コマンド行の 解析または評価を行わなければなりません。

14.2.5 シンボルの削除

DELETE/SYMBOLコマンドは,シンボルを削除します。グローバル・シンボルを削除するには,/GLOBAL 修飾子を指定します。たとえば,グローバル・ シンボルTEMPを削除するには,次のコマンドを入力します。

     $ DELETE/SYMBOL/GLOBAL TEMP

14.3 シンボルの表示

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

14.4 別のシンボルの値としてのシンボルの使用

シンボルを定義しておくと,それを別のシンボルの値として使用することができます。DCL は,シンボルを使用するコンテキストに応じて,シンボルを文字列または数値として解釈します。

次の例では,整数値3をシンボルCOUNTに割り当てています。

     $ COUNT = 3

この場合,COUNTの値を別の割り当て文で使用できます。たとえば,COUNT の値が1に加算されます。

     $ TOTAL = COUNT + 1

結果の(4)がTOTALシンボルに定義されます。

14.4.1 シンボルの連結

いくつかのシンボルを連結して長い文字列を作成するには,プラス記号(+) を使用できます。それぞれのシンボル名の前後に一重引用符(')を置けば,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の内容を印刷します。

14.4.2 文字列割り当ての中に含まれるシンボル

文字列割り当ての中にローカル・シンボルを指定するには,コロンと等号(:=) を使用します。文字列割り当ての中にグローバル・シンボルを指定するには, コロンと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

14.5 シンボルによるデータの格納と操作

シンボルは,コマンド・プロシージャの中の変数として使用できます。変数には, リテラル値以外のものとして計算したり割り当てたりする値が入ります。 たとえば,レキシカル関数の値を変数に割り当てたり,ファイル・ レコードの値を変数に読み込んだりすることができます。

は,値が組み合わされたものです。コマンド・プロシージャの中では, 式は,シンボル割り当て文(等号の右辺),IF文,WRITEコマンドの中で, あるいはレキシカル関数の引数として使用されます。

シンボル定義では,割り当て文の左辺がシンボル名,右辺が式になります。 式の中のそれぞれの値(オペランドとも呼びます) は,演算子によって別の値に接続できます。DCLは式を評価して, その結果をシンボルに割り当てます。式が文字列として評価された場合は, シンボルは文字列値を持ちます。

次の例では,ローカル・シンボルBARKが,3つの数値を加算する式として定義されています。

     $ BARK = 1 + 2 + 3

オペランドは1,2,および3です。演算子はプラス記号(+)です。前の例では, 評価された式が整数なので,シンボルは整数値を持ちます。

14.6 文字列

文字列には,印刷可能な文字が入ります。付録 B に,文字列に指定できるASCII文字セットと DEC Multinational 文字セットの表があります。これらの表は文字列に含むことのできる文字を示しています。

文字は,次の3つに分類されます。


注意
Extended File Specificationsの環境で作業をしている場合は,リッチ・テキスト文字セットと他の使用可能なオプションについては, 『OpenVMS Extended File Specificationsの手引き』を参照してください。

14.6.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"

14.6.2 文字列式

文字列式には,文字列,文字列として評価されるレキシカル関数,文字列値を持つシンボルが入ります。 式の中で文字列を使用する場合には,文字列を引用符(" ") で囲まなければなりません。引用符を使用しないと,文字列はシンボルとして処理されます。

文字列式は,次の値(「文字列オペランド」と呼びます)を組み合わせます。

文字列と数値との間で演算や比較を実行すると,DCLはその文字列を数値に変換します。

文字列オペランドは,後述するように,加算(文字列連結),減算(文字列削減) ,比較,他の文字列との置換を行うことができます。

次の例では,文字列"CAT"は引用符で囲まなければなりません。

     $  TEMP = "CAT"

次の例では,TEMPシンボルは文字列"CAT"を表しています。TOPICシンボルは, 文字列"THE"とTEMPシンボルが表す文字列("CAT")を連結します。結果は"THE CAT" となります。

     $  TOPIC = "THE" + TEMP

次の例では,シンボルCOUNTはレキシカル関数F$STRING(65)を表します。

     $  COUNT = F$STRING(65)

14.6.3 文字列の操作

次のような文字列操作を指定できます。

次の例では,プラス記号(+)を使用して,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"

14.6.4 文字列の比較

2つの文字列を比較する場合,文字列は文字ごとに比較されます。長さの異なる文字列は等しくありません( たとえば,"dogs"は"dog"より大きいとみなされます) 。

比較の際の基準となるのは,文字のASCII値です。この基準のもとでは,0 〜9の数字はA〜Zの英字より小さく,A〜Zの大文字はa〜zの小文字より小さくなります。 次のいずれかの条件が真になると,文字列比較は終了します。

表 14-1に様々な文字列比較のタイプを示します。

表 14-1 文字列比較

比較 演算子 説明
等しい .EQS. 文字列と文字列を比較して, 等しいかどうかを判定する。
より大きい,または等しい .GES. 文字列と文字列を比較して,最初に指定された文字列の値が2番目の文字列の値より大きいかまたは等しいかを判定する。
より大きい .GTS. 文字列と文字列を比較して, 最初に指定された文字列の値が2番目の文字列の値より大きいかどうかを判定する。
より小さい, または等しい .LES. 文字列と文字列を比較して, 最初に指定された文字列の値が2番目の文字列の値より小さいかまたは等しいかを判定する。
より小さい .LTS. 文字列と文字列を比較して, 最初に指定された文字列の値が2番目の文字列の値より小さいかどうかを判定する。
等しくない .NES. 1つの文字列を別の文字列と比較して,等しくないかどうかを判定する。

これらの例の中では,LAST_NAMEシンボルが"WHITFIELD"の値を持つものとします。

14.6.5 部分文字列の置換

置換文字列の位置とサイズを指定すると,文字列の一部だけを別の文字列に置き換えることができます。 この場合の形式は次のとおりです。

ローカル・シンボルの場合は,

シンボル名[オフセット,サイズ] :=置換文字列

グローバル・シンボルの場合は,

シンボル名[オフセット,サイズ] :==置換文字列

各要素は次のとおりです。

オフセット 元の文字列の最初の文字を基準として置換文字列の位置を示す整数である。 オフセット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'

14.7 数値と式の使用方法

数値は次のいずれかの値になります。

シンボルに割り当てる数値は,-2147483648〜2147483647 (10進数)の範囲でなければなりません。 この範囲にない数値を指定した場合や,この範囲にない数値が計算で得られた場合には, エラーは報告されませんが,結果は間違った値になります。

14.7.1 数値の指定

DCLコマンド・レベルとコマンド・プロシージャの中では,数値は次のように指定します。

次の例では,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

14.7.2 数値の内部記憶

数値は,内部的には符号付きの4バイト整数,すなわちロングワードとして格納されます。 正の整数は0〜2147483647の値に,負の整数は4294967296 から数値の絶対値を引いた値になります。たとえば,-15237 という数値は4294952059として格納されます。負の整数は,ASCIIや10進数で表示する場合には, マイナス記号形式に変換されますが,16進数や8 進数で表示する場合には,マイナス記号形式には変換されません。たとえば,-15237 という数値は,16進数の-00003B85ではなく,16進数のFFFFC47B (10 進数4294952059)として表示されます。

数値は,ASCII表記規則を使用して一連の数字としてテキスト・ファイルに格納されます( たとえば,数値の1は49として格納されます)。

数値式では,値はリテラル数(3など)または数値を持つシンボルでなければなりません。 また,数値を表す文字列(たとえば,"23"または"-51") を使用できます。数値と文字列の間で演算を行ったり比較したりする場合, 文字列は数値に変換されます。

数値式は,次の値(整数オペランドと呼ばれます)を組み合わせます。

このような整数オペランドは,後述するように,算術演算子,論理演算子, 比較演算子によって接続できます。

14.7.3 算術演算

次のような算術演算を指定できます。

14.7.4 数値の比較

表 14-2は,数値比較のタイプの一覧です。

表 14-2 数値比較

比較 演算子 説明
等しい .EQ. 数値と数値を比較して, 等しいかどうかを判定する。
より大きい,または等しい .GE. 数値と数値を比較して,最初の数値が2番目の数値より大きいか,または等しいかどうかを判定する。
より大きい .GT. 数値と数値を比較して,最初の数値が2 番目の数値より大きいかどうかを判定する。
より小さい,または等しい .LE. 数値と数値を比較して,最初の数値が2番目の数値より小さいか, または等しいかを判定する。
より小さい .LT. 数値と数値を比較して,最初の数値が2 番目の数値より小さいかどうかを判定する。
等しくない .NE. 数値と数値を比較して, 等しくないかどうかを判定する。

ここに示す例では,BALANCEシンボルが-15237の値を持つと想定しています。

14.7.5 数値オーバレイの実行

特殊な形式の割り当て文を使用すれば,現在のシンボル値のバイナリ・ (ビット・レベル)オーバレイを実行できます。

ローカル・シンボルの場合は,

シンボル名[ビット位置,サイズ] =置換式

グローバル・シンボルの場合は,

シンボル名[ビット位置,サイズ] ==置換式

各要素は次のとおりです。

ビット位置 オーバレイを実行するビット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

14.8 論理値と式の使用

これ以降の節では,論理値と式の使用について説明します。

14.8.1 論理演算

一部の演算では,数値と文字列を次のような値を持つ論理データとして解釈します。

次の例では,DOG_COUNTに13という値が割り当てられています。IF STATUS は,論理値STATUSが真であることを意味します。

     $ STATUS = 1
     $ IF STATUS THEN DOG_COUNT = 13
     $ STATUS = "TRUE"
     $ IF STATUS THEN DOG_COUNT = 13

14.8.2 論理式

論理演算は,演算の対象となる数値のすべてのビットに影響します。 論理式の値は整数であり,式の結果も整数になります。 論理式で文字列値を指定すると,文字列が整数に変換されてから,式の評価が行われます。

通常は,論理式を使用して,論理値の下位ビットを評価します。すなわち, 値が真か偽かを判断します。次の論理演算を指定できます。

次の例は,真の値を偽に反転させます。式の評価は-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

14.8.3 論理演算の結果

次の表は,ビット単位と数値単位の論理演算の結果を示しています。論理演算では, 大文字または小文字の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
奇数 奇数
偶数 奇数 奇数
奇数 偶数
偶数 偶数 奇数
偶数 奇数
奇数 偶数 奇数
偶数 偶数
奇数 偶数 偶数

14.8.4 レキシカル関数が戻す値の使用

レキシカル関数は,通常コマンド・プロシージャの中で使用され,システム・ プロセス,バッチ・キューと印刷キュー,ユーザ・プロセスなどについての情報をシステムから検索します。 レキシカル関数を使用して,文字列を処理したり論理名を変換することもできます。 レキシカル関数をシンボルに割り当てた場合, 実際にはレキシカル関数によって戻される情報( たとえば,数値や文字列)がシンボルに割り当てられます。このとき, 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関数に対して引数を指定する,他の方法を以下の例に示します。 それぞれの例では,引数は文字列式です。

F$DIRECTORYを引数として使用する場合は,前後に引用符を付けません。 関数は自動的に評価されます。F$DIRECTORY関数の結果が戻ってからでないと,F$LENGTH 関数は長さを判別できません。結果が戻ると,F$LENGTH関数は省略時のディレクトリの長さ( 大括弧を含む)を判別します。

14.8.5 演算の順序

式には演算と比較操作をいくつでも指定できます。次の表は,式の中に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

14.8.6 データ・タイプの評価

DCLのシンボルの評価結果は,文字列または整数値のいずれかになります。 シンボルのデータ・タイプ(文字または整数)は,現在割り当てられている値のデータ・ タイプによって決まります。データ・タイプは永久的なものではないので, 値のタイプが変更されると,シンボルのタイプも変更されます。

式は,値のタイプと使用する演算子に応じて,整数値になったり文字列値になったりします。

次の例では,ローカル・シンボルNUMには,最初に文字値が割り当てられ, 次に整数式が割り当てられるときに整数値に変換されます。

     $ NUM = "ABC"
     $ NUM = 2 + 5

次の表は,DCLがどのように式を評価するかをまとめたものです。最初の欄には, 式に指定できる値と演算子を示します。2番目の欄は,それぞれの場合に, 式全体の評価結果のタイプを示しています。表の中で, 任意の値は文字列または整数を表しています。

結果の値タイプ
整数値 整数
文字列値 文字列
整数レキシカル関数 整数
文字列レキシカル関数 文字列
整数シンボル 整数
文字列シンボル 文字列
+, -,または.NOT.任意の値 整数
任意の値.AND.または.OR.任意の値 整数
文字列+または-文字列 文字列
整数+または-任意の値 整数
任意の値+または- 整数 整数
任意の値*または/ 任意の値 整数
任意の値( 文字列比較)任意の値 整数
任意の値(数値比較)任意の値 整数

14.9 式の値タイプの変換

式の中のオペランドがすべて同じ値のデータ・タイプになっていないと, DCLは式を評価できません。値のタイプには,文字列データ・タイプと整数データ・ タイプがあります。文字列データには,文字列,文字列値を持つシンボル, 文字列値を戻すレキシカル関数があります。整数データには, 整数,整数値を持つシンボル,整数値を戻すレキシカル関数があります。1 つの式に数値オペランドと文字列オペランドの両方が入っている場合には,DCL はすべての文字列を整数に変換するか,すべての整数を文字列に変換します。

一般に,文字列値と整数値の両方を使用すると,文字列値が整数に変換されます。 ただし,DCLが文字列比較を行うときは例外で,この場合には整数が文字列に変換されます。

また,次のレキシカル関数を使用すると,式の値を決定したり変更したりできます。

14.9.1 文字列を整数に変換する

文字列は,次のようにして整数に変換されます。

次の表は,文字列を整数値を変換する場合を示しています。

文字列 結果として生じる整数
"123" 123
"12XY" 0 (偽)
"Test" 1 (真)
"hello" 0 (偽)

14.9.2 整数を文字列に変換

整数を文字列に変換すると,結果として生じる文字列には整数値に対応する数値が入ります。 次の表は,整数を文字列値に変換する場合を示しています。

整数 結果として生じる文字列
123 "123"
1 "1"
0 "0"

14.10 シンボル・テーブル

シンボルは,オペレーティング・システムによって管理されるローカル・ シンボル・テーブルまたはグローバル・シンボル・テーブルに格納されます。

14.10.1 ローカル・シンボル・テーブル

DCLでは,コマンド・プロシージャの実行時,CALLコマンドの使用時,およびバッチ・ ジョブのキュー登録時にユーザが作成するすべてのコマンド・ レベルとメイン・プロセスに対して1つずつのローカル・シンボル・ テーブルが保持されます。ローカル・シンボルを作成すると,DCLは,そのシンボルを現在のコマンド・ レベルのローカル・シンボル・テーブルに収めます。 コマンド・レベルのローカル・シンボル・テーブルは,そのレベルが続くかぎり存在しますが, 該当コマンド・レベルが終了すると,そのローカル・ シンボル・テーブル(およびその中のすべてのシンボル)も削除されます。 プロセス,コマンド・プロシージャ,バッチ・ジョブについての詳細は, 第18章を参照してください。

ローカル・シンボル・テーブルには,ユーザが定義したローカル・シンボルに加えて,DCL の8つのシンボルが収められます。P1〜P8までのこれらのシンボルは, パラメータをコマンド・プロシージャに渡すときに使用されます。 コマンド・プロシージャに渡されるパラメータは文字列とみなされます。 それ以外の場合,P1〜P8は空の文字列("")として定義され,ローカル・ シンボル・テーブルに格納されます。

14.10.2 グローバル・シンボル・テーブル

DCLでは,1つのプロセスが存在する間,1つのグローバル・シンボル・テーブルだけが保持され, すべてのグローバル・シンボルがそのテーブルに収められます。 グローバル・シンボル・テーブルには,ユーザがアクセスするグローバル・ シンボルに加えて,後述する予備グローバル・シンボルが収められています。 このようなグローバル・シンボルは,使用しているプログラムやコマンド・ プロシージャ,ならびにシステム・コマンドやユーティリティについての状態情報を提供します。

$STATUS予備グローバル・シンボル

$STATUSは,最も最近実行されたコマンドが戻す条件コードです。シンボル$STATUS はOpenVMSオペレーティング・システムのメッセージ・コードの形式に準拠します。EXIT コマンドにパラメータ値を指定すれば,アプリケーション・ プログラムでグローバル・シンボル$STATUSの値を設定できます。 システムは,$STATUSの値を使用して,どのようなメッセージを表示するか, 次に高いコマンド・レベルで実行を継続するかどうかなどを決定します。$STATUS の下位3ビットの値は,グローバル・シンボル$SEVERITY に収められます。

$SEVERITY予備グローバル・シンボル

$SEVERITYは,最も最近実行されたコマンドが戻す条件コードの重大度レベルです。$STATUS の下位3ビットに等しいシンボル$SEVERITYは,次のような値を持ちます。

0 警告
1 成功
2 エラー
3 情報
4 重大(回復不能な) エラー

$RESTART予備グローバル・シンボル

$RESTARTは,システム・クラッシュによる割り込みが生じた後でバッチ・ ジョブが再開された場合にTRUEの値になります。それ以外の場合は, FALSEの値になります。

14.10.3 シンボル・テーブル検索順序

コマンド・インタプリタはシンボルの値を判別するときに,シンボル・テーブルを次のような順序で検索します。

  1. 現在のコマンド・レベルのローカル・シンボル・テーブル。

  2. 前のコマンド・レベルのローカル・シンボル・テーブル。現在のレベルから後方に検索する。

  3. グローバル・シンボル・テーブル。

14.11 シンボルの値のマスク

これ以降の節では,シンボルの値をマスクする方法について説明します。

14.11.1 SET SYMBOLコマンド

省略時の設定では,外側のコマンド・プロシージャ・レベルで定義されるすべてのシンボル( グローバルとローカル)は,内側のプロシージャ・レベルにアクセスできます。 ただし,SET SYMBOLコマンドを使用すれば,コマンド・ プロシージャの中のローカル・シンボルまたはグローバル・シンボルを他のコマンド・ プロシージャで定義されたシンボルと区別できます。 SET SYMBOLコマンドは,ローカル・シンボルとグローバル・シンボルの値をマスクします。 したがって,コマンド・プロシージャが別のコマンド・ プロシージャを実行する場合,2番目のプロシージャでSET SYMBOLコマンドを指定すれば, 両方のプロシージャで同じシンボル名を使用できます。

SET SYMBOLコマンドは,DCLがコマンド行を処理する前に,動詞文字列(コマンド行の最初のトークン) をシンボルとして変換しようとするかどうかも制御します。 省略時の設定では,変換を行おうとします。この設定を変更して変換を行わないようにすると, コマンドを起動するときに,コマンド・ プロシージャが外側のプロシージャ・レベル環境によって影響されなくなるので便利です。

14.11.2 シンボルの有効範囲

シンボルの有効範囲は,ローカル・シンボルとグローバル・ シンボルとでは異なります。プロシージャ・レベルを終了して,前のプロシージャに戻ると, ローカル・シンボルとグローバル・シンボルの両方で, 前のレベルのシンボル有効範囲コンテキストが復元されます。

現在の汎用シンボルの有効範囲状態を表示するには,レキシカル関数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 修飾子指定するまで,新しいグローバル・ シンボルを作成できなくなります。

14.12 シンボルの置換

コンテキストによっては,英字で始まる文字列がシンボル名またはレキシカル関数として使用されることがあります。 このような場合,DCLはシンボルまたはレキシカル関数をその値と置き換えようとします。 シンボルをその現在の値で置き換えることをシンボル置換といいます。 これ以外のコンテキストでシンボルまたはレキシカル関数を使用する場合には, 置換演算子を使用してシンボル置換を要求しなければなりません。

シンボルの自動評価

シンボルやレキシカル関数が次のように使用された場合,DCLはシンボルやレキシカル関数を自動的に評価します。

次の例では,コマンド・インタプリタは,英字で始まる文字列をシンボル名として, 数値または基数演算子(%)で始まる文字列をリテラル数値として使用します。

14.12.1 シンボル置換の強制

上記の場所にないシンボルの置換を強制するには,次にようにシンボルを一重引用符(') で囲みます。

     $ TYPE 'B'

引用符で囲まれた文字列の中のシンボルの置換を強制するには,そのシンボルの前に2 つの一重引用符(')を付け,シンボルの後に1つの一重引用符(') を付けます。

     $ T = "TYPE ''B'"

コマンド行を処理する場合,DCLは次の順序でシンボルをその値に置換します。

次の例は,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

14.12.2 シンボル置換の演算子

置換演算子を使用すると,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コマンドの結果はそれに応じて変化します。

アンパサンドを使用するときには,次の規則に従ってください。

14.13 コマンド処理の3つのフェーズ

コマンド・インタプリタは,シンボル置換を次の3つのフェーズで実行します。

14.13.1 第1フェーズ:コマンド入力検索

コマンド入力検索では,前に一重引用符が付いたシンボルを左から右に順に評価します。 前に1つの一重引用符が付いたシンボルは,第1フェーズ置換で説明するように, 反復変換されますが, 前に2つの一重引用符が付いたシンボルは反復変換されません。

14.13.2 第2フェーズ:コマンドの解析

コマンド解析フェーズでは,次のことを行います。

このフェーズでのシンボル置換は反復されません。

14.13.3 第3フェーズ:式の評価

式の評価フェーズでは,次のことが行なわれます。

このフェーズでのシンボル置換は反復されません。

コマンド・インタプリタは,コマンド・プロシージャの中で実行されるコマンドやプログラムが入力データとして読み込んだ行は解析しないことに注意してください。 したがって,このようなデータ行ではシンボル置換を行いません。

AVERAGEプログラムは,SYS$INPUT (コマンド入力ストリーム)から55, 57,9999を読み込みます。これらのデータ行はコマンド・インタプリタによっては読み込まれません。 シンボル名を入力しても評価されません。

     $ RUN AVERAGE
     55
     57
     9999

14.13.4 繰り返し置換と反復置換

シンボル置換には,繰り返し置換と反復置換があります。

第1フェーズ置換

一重引用符(')を使用してシンボル置換を要求すると,コマンド・インタプリタは, コマンド処理の第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は一回だけ置換されます。

第2フェーズ置換

コマンド・インタプリタが反復置換を自動的に実行するのは,コマンド行に一重引用符がある場合だけです。 場合によっては,コマンド同意語の定義をネストするとよいでしょう。

次の例では,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文字列が置換されます。

第3フェーズ置換

コマンド・インタプリタがコマンドの中の式を解析すると,式の中に指定されたシンボルは一回だけ置換されます。 ただし,式の中に一重引用符またはアンパサンドを使用すれば, 反復置換を強制できます。このようにして反復置換を強制した場合には, 次の点に注意してください。

置換の結果,有効なシンボル名が得られない場合には,コマンドは正しく実行されないことに注意してください。

次の例は,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'

14.13.5 未定義シンボル

コマンド行でシンボルを使用するときにそのシンボルが未定義の場合には, コマンド・インタプリタは,コンテキストに応じて,エラー・メッセージを表示するか, シンボルを空の文字列と置き換えます。未定義シンボルについては, 次の規則が適用されます。

次の例は,コマンド・インタプリタが前に一重引用符が付いた未定義シンボルをどのように処理するかを示しています。

     $ 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シンボルは未定義であるため,コマンド・インタプリタは式を評価できません。

14.14 シンボルを使用するための別の方法:自動的なフォーリン・ コマンド

プロシージャに対してシンボルを定義せずに,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オペレーティング・ システムで,コマンドの解析とシンボルの置換が実行される方法と一貫しています。

14.14.1 自動的なフォーリン・コマンドの使用

次のことに注意してください。


注意
特権付きユーザが省略時のデバイスおよびディレクトリを他のユーザ・ アカウントに設定した場合には,"SYS$DISK:[]" をDCL$PATH論理名の定義に指定しないでください。この操作を実行すると,DCL はカレント・ディレクトリを検索します。入力エラーがある場合や, 検索リストで変換の配置方法が不適切な場合には, カレント・ディレクトリのユーザ・イメージが検索され,特権が与えられた状態で誤って起動される可能性があります。

14.14.2 自動的なフォーリン・コマンドの制限事項

次の制限事項に注意してください。


[ 前のページ ] [ 次のページ ] [ 目次 ] [ 索引 ] [ DOC Home ]