前へ | 次へ | 目次 | 索引 |
この例では,F$ENVIRONMENT 関数を使用して,現在のメッセージ設定を変更する前に,その設定を保存します。コマンド・プロシージャの最後で,もとのメッセージ設定が復元されます。SAVE_MESSAGE というシンボルを囲む一重引用符 (' ') は,そのシンボル名を値と置き換えるように指定しています。
#2 |
---|
$ MAX = F$ENVIRONMENT("MAX_DEPTH") $ SHOW SYMBOL MAX MAX = 32 Hex = 00000020 Octal = 00000000040 |
この例では,コマンド・プロシージャ内で可能な最大のネスティングの深さを判断するために,F$ENVIRONMENT 関数を使用しています。
#3 |
---|
$ SAVE_PROT = F$ENVIRONMENT("PROTECTION") $ SET PROTECTION = (SYSTEM:RWED, OWNER:RWED, GROUP, WORLD)/DEFAULT . . . $ SET PROTECTION = ('SAVE_PROT')/DEFAULT |
この例では,F$ENVIRONMENT 関数を使用して,保護を変更する前に,現在の省略時の保護を保存します。コマンド・プロシージャの最後で,もとの保護に戻されます。シンボル置換を要求するためには, SAVE_PROT というシンボルを引用符で囲まなければなりません。
文字列から部分文字列を取り出します。
F$EXTRACT (開始, 長さ, 文字列)
開始
取り出したい部分文字列の先頭のオフセットを指定します。 0 以上の整数式として指定します。オフセットは文字の相対位置,または文字列の先頭の部分文字列です。オフセット位置は 0 から始まります。文字列は,常に左端の文字から始まります。
文字列の長さ以上のオフセットを指定した場合には,空文字列 ("") を戻します。
長さ
取り出す文字数を指定します。文字列サイズ以下でなければなりません。長さは,0 以上の整数式を指定します。オフセットから文字列の最後までの文字数より大きな値の長さを指定すると,オフセットから文字列の最後までの文字を戻します。
文字列
編集する文字列を指定します。文字列には,文字列式を指定します。
#1 |
---|
$ NAME = "PAOLO TESTA" $ FIRST = F$EXTRACT(0,5,NAME) $ SHOW SYMBOL FIRST FIRST = "PAOLO" |
この例はコマンド・プロシージャの一部であり,シンボル NAME に割り当てられた文字列から最初の 5 文字を取り出すために, F$EXTRACT 関数を使用しています。オフセット引数と長さ引数は整数であり,文字列引数はシンボルです。レキシカル関数に対する引数として整数やシンボルを使用する場合には,これらを引用符 (" ") で囲む必要はありません。
#2 |
---|
$ P1 = "MYFILE.DAT" $ FILENAME = F$EXTRACT(0,F$LOCATE(".",P1),P1) |
この例もコマンド・プロシージャの一部です。文字列からある 1 文字を見つけ,その位置で終わる部分文字列を取り出す方法を示しています。
F$LOCATE 関数は, P1 に対応する文字列中のピリオドのオフセット位置を示す数値を戻します ( ピリオドのオフセット位置は,ピリオドの前の部分文字列の長さと同じです )。
F$EXTRACT 関数の引数として F$LOCATE 関数を使用して,文字列から取り出す文字数を指定しています。パラメータ MYFILE.DAT を使用してプロシージャを呼び出し,これらのステートメントを実行すると,シンボル FILENAME に MYFILE という値が割り当てられます。
上記の例で F$LOCATE 関数は,ファイル指定にサブディレクトリ名を含むディレクトリ指定や,ノード名が含まれていないとして解釈しています。完全なファイル指定からファイル名を取り出すためには,F$PARSE 関数を使用します。
#3 |
---|
$ IF F$EXTRACT(12,2,F$TIME()) .GES. "12" THEN GOTO AFTERNOON $ MORNING: $ WRITE SYS$OUTPUT "Good morning!" $ EXIT $ AFTERNOON: $ WRITE SYS$OUTPUT "Good afternoon!" $ EXIT |
この例では,現在の時刻が午前であるか午後であるかに応じて,異なるメッセージを表示するプロシージャを示しています。最初に,F$TIME 関数を使用して,現在の時刻が戻されます。 F$TIME 関数は文字列を戻し,この文字列が F$EXTRACT 関数に対する文字列引数として使用されます。 F$TIME 関数が引数として使用されている場合には,この関数は自動的に評価されるので,引用符を使用する必要はありません。
次に F$EXTRACT 関数は, F$TIME から戻された日付と時刻の示された文字列から時を取り出します。 F$TIME から渡される文字列には,常に先頭から12 文字のオフセットから時フィールドが含まれています。
F$EXTRACT 関数は,このオフセットから始まる 2 文字を文字列から取り出し,取り出した文字列値と文字列値 12 を比較します。比較結果が真の場合には,プロシージャは "Good afternoon!" を出力します。比較結果が偽の場合には,"Good morning!" を出力します。
また,時刻指定から時フィールドを取り出すために,F$CVTIME 関数を使用できます。 F$CVTIME 関数を使用する方が,上記の例に示されている方法に比べ簡単です。
$FAO システム・サービスを呼び出し,指定された制御文字列を, ASCII 形式に整えられた出力文字列に変換します。書式を指定して,整数値を文字列に変換したり,キャリッジ・リターンやフォーム・フィードを挿入したり,テキストを挿入したりできます。
F$FAO (制御文字列[,引数[,...]])
制御文字列
出力文字列の固定テキストと FAO ディレクティブを結合したものです。制御文字列の長さは任意であり, FAO ディレクティブをいくつでも含むことができます。制御文字列では,文字列式として指定します。F$FAO 関数は,FAO ディレクティブを使用して,ASCII 形式のデータを変更したり,制御文字列中の固定テキストに割り当てたりします。
表 DCLI-4 は制御文字中で指定する FAO ディレクティブを示しています。
引数[,...]
制御文字列中の FAO ディレクティブに対する 1 〜 15 の引数。引数は,整数式または文字列式として指定します。 表 DCLI-4 は,各 FAO ディレクティブと必要な引数タイプを示しています。FAO ディレクティブは 1 つまたは複数の引数を必要とすることがあります。その順序は,制御文字列のものと正確に一致しなくてはなりません。そうでない場合でも,エラー・メッセージは出力されません。
対応するディレクティブに対して指定可能なタイプ (整数または文字列) ではない引数を指定すると,予測できない結果が戻されます。 F$INTEGER や F$STRING を使用して適当な型に変換してください。
引数に不足がある場合,F$FAO は引数リストを越えて読もうとします。そのため,制御文字列のディレクティブに一致する引数を必ず指定してください。
対応するディレクティブに対して指定可能なタイプ (整数または文字列) ではない引数を指定すると,コマンドが実行されなかったという予測できないエラーになります。このエラーは,$FAO システム・サービスからのものそのままです。
$FAO システム・サービスを起動し,文字および数値入力を ASCII 文字列に変換します (FAO は formatted ASCII output の略です)。書式を指定して,整数値を文字列に変換したり,キャリッジ・リターンやフォームフィードをテキストを挿入したり,テキストを挿入したりできます。以下のフォーマットを使用して FAO ディレクティブを指定します。
フォーマット 機能 !DD 1 つのディレクティブです。 !n(DD) 指定した回数を繰り返します。 !lengthDD 指定した長さのフィールドに出力します。 !n(lengthDD) 指定した回数を繰り返し,指定した長さのフィールドに出力します。
感嘆符 (!) は,それ以降の文字または文字列が FAO ディレクティブとして解釈されることを示しています。 DD は F$FAO が実行するためのアクションであることを示す, 1 つまたは 2 つの大文字のコードを表しています。繰り返し数を指定する場合, n はディレクティブが繰り返される回数を指定する 10 進数です。 length 値は,"length" 文字の出力フィールドを表わすために F$FAO に指示する 10 進数です。
繰り返し回数と出力の長さは,絶対数ではなく, (#) を使用して指定することもできます。 (#) を使用した場合は,引数リストの相当する位置に整数式として数値を指定します。
変数出力フィールドを繰り返し回数で指定すると,長さパラメータは 1 つだけ必要です。これは,各出力文字列はそれぞれ長さを指定しているからです。
FAO ディレクティブは以下のカテゴリでグループ化されます。
- 文字列挿入
- ゼロ埋め込み数値変換
- 空白埋め込み数値変換
- 特殊編集
- パラメータ解釈
表 DCLI-4 は, FAO ディレクティブと必須の引数タイプを示しています。次の節では文字列挿入, ゼロ埋め込み数値変換,および空白埋め込み数値変換を実行するディレクティブの出力文字列を説明します。
注意
$FAO システム・サービスではサポートされていますが, DCL F$FAO レキシカル関数ではサポートされていない 2 つのタイプのディレクティブがあります。その 2 つのタイプを次に示します。
- クォドワード数値ディレクティブ (Q, H, および J)。すべての DCL 数値はロングワードとして格納されるので,DCL ではサポートされません。
- !AS ディレクティブ以外の文字列ディレクティブ。すべての DCL 文字列は記述子として格納されるので,DCL ではサポートされません。
$FAO システム・サービス・ディレクティブについての詳細は『OpenVMS System Services Reference Manual』を参照してください。
表 DCLI-4 FAO ディレクティブの要約 ディレクティブ 引数の型 説明 文字列挿入: !AS 文字列 文字列をそのまま挿入する。 ゼロ埋め込み数値変換: !OB 整数 バイトから8進数表現に変換する。 !OW 整数 ワードから8進数表現に変換する。 !OL 整数 ロング・ワードから8進数表現に変換する。 !XB 整数 バイトから 16 進数表現に変換する。 !XW 整数 ワードから 16 進数表現に変換する。 !XL 整数 ロング・ワードから 16 進数表現に変換する。 !ZB 整数 バイトから 10 進数表現に変換する。 !ZW 整数 ワードから 10 進数表現に変換する。 !ZL 整数 ロング・ワードから 10 進数表現に変換する。 空白埋め込み数値変換: !UB 整数 負数調整なしにバイトから 10 進数表現に変換する。 !UW 整数 負数調整なしにワードから 10 進数表現に変換する。 !UL 整数 負数調整なしにロング・ワードから 10 進数表現に変換する。 !SB 整数 負数変換してバイトから 10 進数表現に変換する。 !SW 整数 負数変換してワードから 10 進数表現に変換する。 !SL 整数 負数変換してロング・ワードから 10 進数表現に変換する。 特殊編集: !/ None キャリッジ・リターンとライン・フィードを挿入する。 !_ None タブを挿入する。 !^ None フォーム・フィードを挿入する。 !! None 感嘆符(!)を挿入する。 !%I 整数 ロング・ワードの整数を名前形式の UIC 形式 [グループ識別子,メンバ識別子] に変換する。 !%S None 最近変換された数値が 1 でないとき"S" を挿入する。 (マルチ・リンガル製品で使用することは推奨しません。) !%U 整数 ロング・ワードの整数を数値 UIC 形式[g,m] に変換する。ここで g はグループ番号,m はメンバ番号。 ディレクティブが,かぎかっことカンマを挿入する。 !n<...!> None n 文字のフィールドに,すべてのデータを左詰めし,残りを空白で埋める。 !n* c None c で表現される文字を n 回繰り返する。 !n%C 文字列 最も最近評価された引数の値が n の時,文字列を挿入する(マルチ・リンガル製品で使用する)。 !%E 文字列 最も最近評価された引数が先行するどの !n%C ディレクティブにも一致しない時,文字列を挿入する(マルチ・リンガル製品で使用する)。 !%F None 複数形の終わりにマークする。 !%T 整数 0 現在時刻を挿入する。 !%D 整数 0 現在日付時刻を挿入する。 引数の解釈: !- None 最後の引数を再使用する。 !+ None 次の引数をスキップする。
!AS ディレクティブは,制御文字列に (ディレクティブの引数として指定された) 文字列を挿入します。制御文字列に文字列を挿入した場合,文字列のフィールドの長さは,文字列の長さになります (これが省略時の設定です)。省略時の長さが明示的に指定したフィールドの長さよりも短い場合は,文字列は左詰めされ,残りは空白で埋められます。省略時の長さが明示的に指定したフィールドの長さよりも長い場合は,文字列の右端は切り捨てられます。
ゼロ埋め込み数値変換のためのディレクティブは,(ディレクティブの引数として指定された) 整数を,10 進数,8 進数,または 16 進数表現に変換します。整数の ASCII 表現は,制御文字列に挿入されます。変換された引数の省略時の出力フィールドの長さは,以下のように決められます。
- 引数を 10 進数表現に変換するディレクティブは,バイト変換では 3 桁, ワード変換では 6 桁,ロングワード変換では 11 桁を返します。数字は右詰めされ,左端はゼロで埋められます。省略時の長さより明示的に指定したフィールドの長さが長い場合は,左端は空白で埋められます。省略時の長さより明示的に指定したフィールドの長さが短い場合は,左端は切り捨てられます。
- 引数を 8 進数表現に変換するディレクティブは,バイト変換では 2 桁,ワード変換では 4 桁,ロングワード変換では 8 桁を返します。数字は右詰めされ,左端はゼロで埋められます。省略時の長さより明示的に指定したフィールドの長さが長い場合は,左端は空白で埋められます。省略時の長さより明示的に指定したフィールドの長さが短い場合は,左端は切り捨てられます。
- 引数を 16 進数表現に変換するディレクティブは, 16 進数で要求される数の文字を返します。省略時の長さより明示的に指定したフィールドの長さが長い場合は,左端はゼロで埋められます。省略時の長さより明示的に指定したフィールドの長さが短い場合は,出力フィールドはすべてアスタリスク (*) で埋められます。
バイト変換では引数の 2 進表現の下位 8 ビットのみを,ワード変換では下位 16 ビットのみを使用します。ロングワード変換では,32 ビットすべてを使用します。
空白埋め込み数値変換のディレクティブは,(ディレクティブの引数として指定された) 整数を 10 進数表現に変換します。これらのディレクティブは,符号付きあるいは符号なしとして整数を変換できます。整数の ASCII 表現は,制御文字列に挿入されます。
変換された引数の出力フィールドの長さは,必要な文字数です (これが省略時の設定です)。明示的に指定したフィールドの長さよりも値が短い場合は,右詰めされ残は空白で埋められます。明示的に指定したフィールドの長さよりも値が長い場合は,フィールドはアスタリスクで埋められます。
バイト変換では引数の 2 進表現の下位 8 のみを,ワード変換では下位 16 ビットのみを使用します。ロングワード変換では 32 ビットすべてを使用します。
!n%C および !%E ディレクティブは, (最後に評価された引数の値をもとにした) ASCII 文字を出力文字列に挿入します。これらのディレクティブは,不規則な複数の名詞や動詞を挿入するときに便利です。
最後に評価された引数が n と等しい場合は, 2 つのディレクティブ間のテキストは出力文字列に挿入されます。最後に評価された引数が n と等しくない場合は,次の !n%C ディレクティブが実行されます。
n が負数の場合は,引数として指定し(#)を使用しなくてはなりません。
!n%C および !%E ディレクティブを,繰り返し回数で指定することができます。繰り返し回数を指定すると,2 つのディレクティブ間のテキストは指定された回数だけ出力文字列にコピーされます。
%F ディレクティブは複数の文の終わりを示します。
#1 |
---|
$ COUNT = 57 $ REPORT = F$FAO("NUMBER OF FORMS = !SL",COUNT) $ SHOW SYMBOL REPORT REPORT = "NUMBER OF FORMS = 57" |
このコマンド・プロシージャでは,制御文字列で !SL という FAO ディレクティブを使用することにより, COUNT というシンボルに割り当てられている値が,文字列に変換されます。変換後の文字列は,制御文字列に挿入されます。
COUNT には,57 という整数値が割り当てられています。したがって F$FAO関数は "NUMBER OF FORMS=57" という ASCII 文字列を戻し,この文字列をREPORT というシンボルに割り当てます。
#2 |
---|
$ A = "ERR" $ B = "IS" $ C = "HUM" $ D = "AN" $ PHRASE = F$FAO("TO !3(AS)",A,B,C+D) $ SHOW SYMBOL PHRASE $ PHRASE = "TO ERRISHUMAN" |
前へ 次へ 目次 索引