前へ | 次へ | 目次 | 索引 |
ファイル名をパラメータとして使用するコマンド・プロシージャは,ODS-5 環境では異なった結果を生成する場合があります。
解析スタイルは TRADITIONAL から EXTENDED に変更することができます。この項では,EXTENDED に変更した場合に影響を受ける可能性のある,次の分野について説明します。
解析スタイルの切り替えについての詳細は,
第 5.3 節 を参照してください。
13.18.1 コマンド・プロシージャのファイル指定
インダイレクト・コマンド・プロシージャが使用されている場合には,一部のプロシージャの引数を引用符で囲む必要がある場合があります。
次の例は,同じコマンド・ファイル SS.COM を使用した場合の,TRADITIONAL 解析スタイルと EXTENDED 解析スタイルの出力の違いを示しています。
$ create ss.com $ if p1 .nes. "" then write sys$output "p1 = ",p1 $ if p2 .nes. "" then write sys$output "p2 = ",p2 $ if p3 .nes. "" then write sys$output "p3 = ",p3 |
$ set process/parse_style=traditional $ @ss ^ parg2 parg3 p1 = ^ p2 = PARG2 p3 = PARG3 |
サーカンフレックス(^)は,最初の引数であり(エスケープ文字ではない),プロシージャ引数 p2 および p3 の大文字と小文字の区別が保存されていないことに注意してください。
$ set process/parse_style=extended $ @ss ^ parg2 parg3 p1 = ^ PARG2 p2 = PARG3 |
コマンド・プロシージャでサーカンフレックス(^)が,スペースを引数の区切り文字としてではなくリテラル文字として識別するエスケープ文字として認識されている
ことと,"^ PARG2" が最初の引数であることに注意してください。大文字と小文字の区別は保存されません。
$ @ss "^" parg2 parg3 p1 = ^ p2 = PARG2 p3 = PARG3 |
サーカンフレックス(^)は引用文字列の中にあるため,エスケープ文字としては処理されません。
$ @ss "^" parg2 "parg3" p1 = ^ p2 = PARG2 p3 = parg3 |
プロシージャ引数 p3 の大文字と小文字の区別が保存されていることに注意してください。
$ set process/parse_style=traditional $ @ss^ parg2 parg3 p1 = ^ p2 = PARG2 p3 = PARG3 |
$ set process/parse_style=extended $ @ss^ parg2 parg3 -RMS-E-FNF, file not found |
DCL は,ファイル指定の大文字と小文字の区別を保存しようとします。実際にファイル指定の大文字と小文字の区別が保存されるのは, Command Definition Utility(CDU)を使用して定義されたコマンドに限られます。DCL は,$FILE 解析タイプを持つコマンド定義ファイル(.CLD)の中で定義されている項目の大文字と小文字の区別を保存します。
詳細は,『OpenVMS Command Definition, Librarian, and Message Utilities Manual』を参照してください。
13.18.3 アンパサンドと一重引用符の置換
一重引用符ではなくアンパサンド(&)による置換を使用して,従来型の解析の際に大文字と小文字の区別を保存することができます。
次の従来型の解析の例は,文字列の大文字と小文字の区別を変更する一連のコマンドを示しています。
$ set process/parse_style=traditional $ x = "string" $ define y 'x' $ sho log y "Y" = "STRING"(LNM$PROCESS_TABLE) $ define y &x %DCL-I-SUPERSEDE, previous value of Y has been superseded $ sho log y "Y" = "string"(LNM$PROCESS_TABLE) |
アンパサンド(&)を使用することにより,変数 x に割り当てられた文字列の大文字と小文字の区別が保存されていることに注意してください。
一重引用符による置換は,コマンド行が大文字に設定される前に実行され,アンパサンドによる置換は,コマンド行が大文字に設定された後で実行されます。
次の拡張解析機能の例は,同じ一連のコマンドを示しています。
$ set process/parse_style=extended $ define y 'x' %DCL-I-SUPERSEDE, previous value of Y has been superseded $ sho log y "Y" = "string"(LNM$PROCESS_TABLE) $ define y &x %DCL-I-SUPERSEDE, previous value of Y has been superseded $ sho log y "Y" = "string"(LNM$PROCESS_TABLE) |
変数 y に割り当てられた文字列はどちらも小文字で返されていることに注意してください。これは,DEFINE コマンドが,大文字と小文字の区別を保存する $FILE を使用しているために発生します。
このような特徴を持つことから,アンパサンドによる置換は,解析スタイルが TRADITIONAL に設定されている場合でも EXTENDED ファイル名を指定するために使用することができます。次に例を示します。
$ set process/parse=extended $ cre file^ name.doc Contents of an ODS5 file Exit $ set process/parse=traditional $ a = "file^ name.doc" $ type file^ name.doc %DCL-W-PARMDEL, invalid parameter delimiter - check use of special characters \^NAME\ $ type 'a' %DCL-W-PARMDEL, invalid parameter delimiter - check use of special characters \^NAME\ $ type &a Contents of an ODS5 file |
アンパサンドによる置換は,フォーリン・コマンドには使用できません。 |
拡張 DCL プログラミングとは,複雑なコマノド・プロシージャと DCL コマンドの PIPE コマンドを使用することです。この章は,第 13 章 を読み,DCL でのプログラミングについての基本的な知識があり,高度なプログラミング方式を学習したい方を対象にしています。
複雑なコマンド・プロシージャは,プログラムと同様の機能を実行できます。コマンド・プロシージャでは,変数入力を使用でき,特定の条件が真のときにだけプロシージャのセクションを実行でき,サブルーチンを実行したり,他のコマンド・プロシージャを起動することができます。
DCL の PIPE コマンドも,プログラムと同様の機能を実行できます。たとえば PIPE コマンドを使用すると,同一 DCL コマンド行から,次に示す 1 つまたは複数の操作を実行できます。
本章では,次のことについて説明します。
コマンド・プロシージャでは,ユーザが提供するデータを必要とすることがよくあります。このデータ,つまり入力は会話形式で入手でき(第 13 章 を参照),非会話形式で入手することもできます。本章では,非会話型入力方式について説明し,第 13 章 で説明していない会話型入力方式についても説明します。
コマンド・プロシージャを実行するたびに,同じデータを使用できます。同じデータを使用するには,コマンド・プロシージャでデータを必要とするコマンドの後のデータ行にデータを指定します。
次のコマンド・プロシージャは,CENSUS.EXE コマンド・プロシージャを実行します。CENSUS.EXE はプロシージャが実行されるたびに 1993,1994,1995 のデータを読み込みます。
$ ! CENSUS.COM $ ! $ RUN CENSUS 1993 1994 1995 $ EXIT |
14.1.1 コマンド・プロシージャにデータを登録する場合の制限事項
DCL は,データ行に指定されたテキストをコマンド・プロシージャに直接渡します。したがって,次に示すように,変換しなければならないデータは処理されません。
この後の節では,次に示すように,コマンド・プロシージャに対する入力データを入手するための別の方法について説明します。
コマンド・プロシージャにデータとしてパラメータを渡す場合には,次のガイドラインに従ってください。
DCL はローカル・シンボル P1〜P8 を使用して,パラメータをコマンド・プロシージャに渡します。P1 には最初のパラメータ値が割り当てられ,P2 には 2 番目のパラメータ値,P3 には 3 番目のパラメータ値が割り当てられます。以下も同様です。たとえば,次のコマンドは,コマンド・プロシージャ SUM.COM を起動し,8 つのパラメータをプロシージャに渡します。
$ @SUM 34 52 664 89 2 72 87 3 |
パラメータとして整数を指定した場合には,それは文字列に変換されます。次の例では,P1 は文字列値 24 であり,P2 は文字列値 25 です。
$ @ADDER 24 25 |
シンボル P1〜P8 は,整数式と文字列式の両方で使用できます。DCL は必要な変換を自動的に実行します。
14.2.2 文字列としてのパラメータの指定
文字列内のスペース,タブ,小文字を保存するには,文字列の前後を引用符(" ")で囲みます。次の例を参照してください。
$ @DATA "Paul Cramer" |
次の例では,P1 は Paul Cramer であり,P2 はヌルです。引用符を省略した場合には,各文字列は独立したパラメータとして渡されます。次の例を参照してください。
$ @DATA Paul Cramer |
この例では,文字列 Paul と Cramer が大文字に変換され,P1 は PAUL に,P2 は CRAMER になります。
もう 1 つの例として,次のコマンドで DATA.COM を起動した場合を考えます。
$ @DATA "Paul Cramer" 24 "(555)111-1111") |
P1〜P8 は DATA.COM の中では次のように定義されています。
P1 = Paul Cramer
P2 = 24
P3 =(555)111-1111
P4--P8 = null
シンボル値を渡すには,シンボルの前後を一重引用符で囲みます。シンボル値の内部でスペース,タブ,小文字を保存するには,値を 3 組の引用符で囲みます。文字列の一部として引用符を使用する場合には,3 組の引用符を使用しなければなりません。
別の方法として,テキストを引用符で囲み,シンボルが表示されるときに,シンボルの前に 2 つの一重引用符を指定し,シンボルの後に 1 つの一重引用符を指定する方法があります。
次の例では,P1 は Paul であり,P2 は Cramer です。シンボルをコマンド・プロシージャに渡すときに,DCL は引用符を削除します。
$ NAME = "Paul Cramer" $ @DATA 'NAME' |
次の例では,P1 は "Paul Cramer" であり,P2 はヌルです。
$ NEW_NAME = """Paul Cramer""" $ @DATA 'NEW_NAME' |
次の例では,P1 は Paul Cramer に変換されます。
$ ! DATA.COM $ @NAME "''P1'" |
空のパラメータを渡すには,コマンド文字列の位置を表す一組の二重引用符を使用します。次の例では,DATA.COM に渡される最初のパラメータは空のパラメータです。
$ @DATA "" "Paul Cramer" |
この例では,P1 が空値で,P2 が Paul Cramer です。
14.3 バッチ・ジョブにデータを渡すためのパラメータの使用
バッチ・モードで実行されるコマンド・プロシージャにパラメータを渡すには,SUBMIT コマンドの修飾子 /PARAMETERS を使用します。
1 つの SUBMIT コマンドを使用して,複数のコマンド・プロシージャを実行する場合には,指定したパラメータは,バッチ・ジョブ内の各コマンド・プロシージャに対して使用されます。
次の例では,コマンドは,3 つのパラメータをコマンド・プロシージャ ASK.COM と GO.COM に渡します。これらのコマンド・プロシージャはバッチ・ジョブとして実行されます。
$ SUBMIT/PARAMETERS=(TODAY,TOMORROW,YESTERDAY)ASK.COM, GO.COM) |
次の例では,SUBMIT コマンドは,2 つのパラメータをコマンド・プロシージャ LIBRARY.COM と SORT.COM に渡します。
$ SUBMIT- _$ /PARAMETERS=(DISK:[ACCOUNT.BILLS]DATA.DAT,DISK:[ACCOUNT]NAME.DAT)- _$ LIBRARY.COM, SORT.COM |
ユーザがログインして,各コマンド・プロシージャを実行したかのように,バッチ・ジョブが実行されます。この SUBMIT コマンドが実行するバッチ・ジョブは,ユーザのアカウントにログインし,ユーザのログイン・コマンド・プロシージャを実行し,その後,次のコマンドを実行します。
$ @LIBRARY DISK:[ACCOUNT.BILLS]DATA.DAT DISK:[ACCOUNT]NAME.DAT) $ @SORT DISK:[ACCOUNT.BILLS]DATA.DAT DISK:[ACCOUNT]NAME.DAT) |
データをコマンド・プロシージャの中に指定する方法,SYS$INPUT をファイルとして定義する方法でも,データをバッチ・ジョブに渡すことができます。指定されたパラメータは,バッチ・ジョブのそれぞれのコマンド・プロシージャで使用されます。
14.4 ネスティングしたコマンド・プロシージャにデータを渡すためのパラメータの使用
ネスティングしたコマンド・プロシージャに最大 8 つのパラメータを渡すことができます。ネスティングしたプロシージャでのローカル・シンボル P1〜P8 は,起動するプロシージャのローカル・シンボル P1〜P8 と関連づけられません。
次の例では,DATA.COM は,ネスティングしたコマンド・プロシージャ NAME.COM を起動します。
$ ! DATA.COM $ @NAME 'P1' Joe Cooper |
DATA.COM の P1 が Paul Cramer という文字列である場合には,この文字列引用符が含まれていないため,2 つのパラメータとして NAME.COM に渡されます。NAME.COM では,P1〜P8 は次のように定義されます。
P1 = PAUL
P2 = CRAMER
P3 = JOE
P4 = COOPER
P5--P8 = null
DATA.COM の P1 が "Paul Cramer"(引用符が含まれている)の場合には,次に示すように,3 組の引用符で P1 を囲むことにより,1 つのパラメータとして値を NAME.COM に渡すことができます。
$ ! DATA.COM $ QUOTE = """ $ P1 = QUOTE + P1 + QUOTE $ @NAME 'P1' "Joe Cooper" |
この例では,コマンド・プロシージャ NAME.COM で P1 は Paul Cramer であり,P2 は Joe Cooper です。
前へ | 次へ | 目次 | 索引 |