日本-日本語
日本HPホーム 製品 & サービス サポート & ドライバー ソリューション ご購入方法
≫  お問い合わせ

製品とサービス >  ソフトウェアとOS >  OpenVMS >  マニュアル

OpenVMS マニュアル


HP OpenVMS
DCL ディクショナリ


目次 索引



コマンド・プロシージャ内でラベルを付けられたサブルーチンへ制御を移します。

形式

CALL ラベル [パラメータ [...]]


パラメータ



ラベル

コマンド行の最初に現われる,1 〜 255 桁の英数字からなるラベル名です。ラベルにブランクを含めることはできません。CALL コマンドが実行されるとき,指定されたラベルに後続するコマンドへ制御が移ります。

ラベルは,現在のコマンド・プロシージャの CALL 文の前に,あるいは後に置くことができます。コマンド・プロシージャ内のラベルは,コロン (:) で終了してください。サブルーチンのラベルは一意でなければなりません。

より内側のプロシージャ・レベルのラベルは,外側のプロシージャレベルからはアクセスできません。次の例を参照してください。

$CALL B 
$A: SUBROUTINE 
$  B: SUBROUTINE 
$  ENDSUBROUTINE 
$ENDSUBROUTINE 

この例では,サブルーチン A 内のラベル B は,サブルーチン A より外側ではアクセスできません。

パラメータ [...]

コマンド・プロシージャに渡す 1 つから 8 つのパラメータを指定します。空パラメータは連続する 2 つの引用符(" ")を用いて指定します。これらのパラメータは,文字列値を入力した順に, P1,P2,..., P8 と 8 つまでのシンボルに割り当てられます。シンボルは,指定されたコマンド・プロシージャの内部だけで有効です。各パラメータは, 1 つまたは複数のスペースで区切ります。

DCL_CTLFLAGS のビット 3 を 1 に設定すると, 1 から 16 のオプション・パラメータをコマンド・プロシージャに渡すことができます。空パラメータを指定するには,連続する 2 つの引用符 ("") を使用します。パラメータにより,シンボル (P1, P2, ... P16) に文字列値が入力した順に割り当てられます。このシンボルは,指定されたコマンド・プロシージャの内部でのみ有効です。各パラメータは,1 つまたは複数の空白で区切ります。 DCL_CTLFLAGS のビット 3 をクリアすると,省略時のパラメータ (すなわち P1, P2, ... P8) が設定されます。

パラメータは,英数字または特殊文字を含む文字列値として指定することができますが,次の制約があります。

  • コマンド・インタプリタは英字を大文字に変換し,各パラメータを区切るためにスペースを使用します。したがって,スペースや小文字を含むパラメータを渡すためには,パラメータを引用符 (" ") で囲む必要があります

  • 最初のパラメータがスラッシュ文字 (/) から始まる場合には,パラメータを二重引用符で囲まなければなりません。

  • リテラルとしての引用符,およびスペースを含むパラメータを渡すには,文字列全体を二重引用符で囲み,文字列の中に連続する 2 つの二重引用符を指定します。次の例を参照してください。

    $ CALL SUB1 "Never say ""quit"""
    


    制御が SUB1 に移るとき,パラメータ P1 には次の文字列が割り当てられます。

    Never say "quit" 
    


    文字列に引用符が含まれており,スペースが含まれていない場合には,引用符はそのまま保存され,引用符で囲まれた英字は小文字のまま保存されます。次の例を参照してください。

    $ CALL SUB2 abc"def"ghi 
    


    制御が SUB2 に移るとき,パラメータ P1 には次の文字列を割り当てられます。

    ABCdefGHI 
    

シンボルをパラメータとして使用する場合には,シンボル置換を実行するために,シンボルを一重引用符 (' ') で囲む必要があります。次の例を参照してください。

$ NAME = "JOHNSON" 
$ CALL INFO 'NAME'

一重引用符を使用すると,シンボル 'NAME' が値 "JOHNSON" に置き換えられます。したがって,"JOHNSON" というパラメータが P1 として,サブルーチン INFO に渡されます。


説明

CALL コマンドは,コマンド・プロシージャ内でラベルを付けられたサブルーチンへ制御を移します。CALL コマンドは @ ( プロシージャ実行 ) コマンドに同様に,新しいプロシージャ・レベルを作成します。 CALL コマンドを使用する利点は,プロシージャを処理するためにファイルをオープンしたりクローズする必要がないことです。また,複数のプロシージャは複数のファイルではなく 1 つのファイル中にあるので,CALL コマンドを使用するとプロシージャの管理が簡単です。

CALL コマンドを使用してサブルーチンに制御を移すと,新しいプロシージャ・レベルが作成され,指定された引数の値が P1 から P8 までのシンボルに割り当てられます。 DCL_CTLFLAGS のビット 3 が 1 に設定されている場合, CALL コマンドを使用して制御をサブルーチンへ移すことができます。この際,新しいプロシージャ・レベルが作成され,提供された引数がシンボル P1 から P16 に割り当てられます。 EXIT コマンドが実行されるまで,サブルーチンでの実行が続きます。EXIT コマンドが実行されると,制御は CALL コマンドの次のコマンド行に移ります。

プロシージャは,最大で 32 レベルまでネストさせることができます。この中には,コマンド・プロシージャの任意の組み合わせやサブルーチンの呼び出しを含めることができます。ネストしたサブルーチン構造内で定義されたローカル・シンボルやラベルは,@ コマンドでルーチンを起動した場合と同様に扱われます。つまり,ラベルはそれを定義したサブルーチン・レベルでのみ有効です。

より外側のレベルで定義されたローカル・シンボルは,それより内部のネスト・レベルのサブルーチンでは使用できます。つまり,ローカル・シンボルの読み込みはできますが書き込みはできません。より外側のサブルーチン・レベルでローカルなシンボルに値を割り当てると,現在のサブルーチン・レベルに新しいシンボルが作成されます。この時,より外側のプロシージャ・レベルのシンボルは変更されません。

SUBROUTINE および ENDSUBROUTINE コマンドは,サブルーチンの開始および終了を定義します。サブルーチンへのエントリ・ポイントを定義するラベルは,SUBROUTINE コマンドの直前または同一コマンド行上で指定しなければなりません。

1 つのサブルーチンには,1 つのエントリ・ポイントしか含めることができません。サブルーチンは,最初の実行可能文 SUBROUTINE コマンドで開始しなければなりません。プロシージャ内で EXIT コマンドを指定しないと, ENDSUBROUTINE コマンドが EXIT コマンドと同じ処置を行います。

SUBROUTINE コマンドは,実行されるコンテキストに依存する 2 つの異なる処理を行います。CALL コマンドの結果として SUBROUTINE コマンドを実行する場合は,新しいプロシージャ・レベルを開始し,CALL コマンドで指定したように P1 から P8 までのパラメータを定義し,サブルーチンの実行を開始します。 DCL_CTLFRAGS のビット 3 が 1 に設定されている場合, CALL コマンドでパラメータを最大 P16 まで定義することが可能になります。 CALL コマンドを使用せずに起動されたプロシージャの実行フローで SUBROUTINE 動詞が検出された場合は,SUBROUTINE 以降のすべてのコマンドは,対応する ENDSUBROUTINE コマンドが検出されるコマンドまでスキップされます。

  注意
SUBROUTINE および ENDSUBROUTINE コマンドは,3 文字以下に短縮することはできません。


修飾子



/OUTPUT=ファイル指定

すべての出力を,指定したファイルまたはデバイスに書き込みます。省略時設定では,出力は現在の SYS$OUTPUT という論理デバイスに送られ,出力ファイル・タイプは .LIS です。システムからの応答とエラー・メッセージは,指定したファイルと SYS$COMMAND の両方に書き込まれます。 /OUTPUT を指定する場合には,修飾子は CALL コマンドのすぐあとに指定しなければなりません。出力ファイル指定には,ワイルド・カード文字は使用できません。

コマンド・プロシージャからの出力先を変更するには, SYS$OUTPUT の定義を変更することもできます。コマンド・プロシージャの 1 行目として次のコマンドを指定すると,出力は指定したファイルに送られます。

$ DEFINE SYS$OUTPUT filespec 

このプロシージャが終了すると,SYS$OUTPUT は元の等価文字列に戻されます。この方法を使うと,コマンド・プロシージャの実行時に /OUTPUT 修飾子を使用した場合と同じ結果になります。


#1
$ 
$! CALL.COM 
$ 
$! Define subroutine SUB1 
$! 
$ SUB1: SUBROUTINE 
   .
   .
   .
$       CALL SUB2       !Invoke SUB2 from within SUB1 
   .
   .
   .
$       @FILE           !Invoke another procedure command file 
   .
   .
   .
$       EXIT 
$       ENDSUBROUTINE   !End of SUB1 definition 
$! 
$! Define subroutine SUB2 
$! 
$ SUB2: SUBROUTINE 
   .
   .
   .
$       EXIT 
$       ENDSUBROUTINE   !End of SUB2 definition 
$! 
$! Start of main routine. At this point, both SUB1 and SUB2 
$! have been defined but none of the previous commands have 
$! been executed. 
$! 
$ START: 
$       CALL/OUTPUT=NAMES.LOG SUB1 "THIS IS P1" 
   .
   .
   .
$       CALL SUB2 "THIS IS P1" "THIS IS P2" 
   .
   .
   .
$       EXIT            !Exit this command procedure file 

このコマンド・プロシージャは,ラベルの付いたサブルーチンへ制御を移すための CALL コマンドの使い方を示しています。この例は,サブルーチンあるいは別のコマンド・ファイルを,サブルーチンとして呼べることを示します。

CALL コマンドは,出力ファイルを NAMES.LOG として,サブルーチン SUB1 を起動します。また,他のユーザにファイルへの書き込みアクセスを認めます。サブルーチン SUB2 は SUB1 に呼ばれます。プロシージャは SUB2 を実行し,次にコマンド・プロシージャ FILE.COM を起動するために @ ( プロシージャ実行)コマンドを用います。

SUB1 のコマンドがすべて実行されると,メイン・プロシージャの CALL コマンドは次に SUB2 を呼び出します。SUB2 が実行されるまで,プロシージャは継続します。


目次 索引

プライバシー 本サイト利用時の合意事項 ウェブマスターに連絡