バージョン 6.3.3
 —  ステートメント  —

EXAMINE

このドキュメントでは、次のトピックについて説明します。

関連ステートメント:ADD | COMPRESS | COMPUTE | DIVIDE | MOVE | MOVE ALL | MULTIPLY | RESET | SEPARATE | SUBTRACT

関連機能グループ:「算術演算とデータ移動操作


構文 1 - EXAMINE

EXAMINE [DIRECTION-clause]
  [FULL [VALUE [OF]]]

operand1

  SUBSTRING (operand1,operand2,operand3)
  POSITION-clause    
  [FOR] [FULL [VALUE [OF]]] [PATTERN] operand4
  [DELIMITERS-option]
  {[DELETE-REPLACE-clause] [GIVING-clause]}  

構文図で使用されている記号については、「構文記号」を参照してください。

構文説明 - 構文 1

EXAMINE ステートメントは、英数字やバイナリフィールドの内容、または配列内にあるフィールドの範囲を調べるため、および次の目的で使用します。

オペランド定義テーブル:

オペランド 構文要素 フォーマット オペランド参照 ダイナミック定義
operand1 C* S A     A U         B             不可
operand2 C S           N P I   B*             不可
operand3 C S           N P I   B*             不可
operand4 C S A     A U         B             不可

* GIVING 節を使用する場合、operand1 に定数を指定できます。DELETE または REPLACE 節を使用する場合、定数の指定はできません。

* operand2 および operand3 のフォーマット B は、4 以下の長さでのみ使用できます。

構文要素の説明:

DIRECTION-clause

方向節では、検索方向を決めます。 詳細については、下記の「DIRECTION 節」を参照してください。

operand1

operand1 では、内容を調べるフィールドを指定します。

operand1DYNAMIC 変数である場合は、REPLACE 操作でフィールドの長さを拡張または縮小できます。また、DELETE 操作で、フィールド長を "0" に設定することもできます。 DYNAMIC 変数の現在の長さは、システム変数 *LENGTH を使用して確認できます。 DYNAMIC 変数の全般的な情報については、「ラージ変数/フィールドとダイナミック変数/フィールド」セクションを参照してください。

POSITION-clause

POSITION 節は、operand1(または operand1 のサブストリング)内の調査の開始位置と終了位置を指定するために使用できます。 詳細については、下記の「POSITION 節」を参照してください。

operand4

operand4 では、EXAMINE 操作に使用する値を指定します。

operand4 および operand6 の詳細については、DELETE REPLACE 節で使用される下記の operand6 を参照してください。

FULL オペランドに FULL を指定すると、末尾の空白も含めて値全体が処理されます。 FULL を指定しない場合は、オペランド内の末尾の空白は無視されます。
SUBSTRING

通常、フィールドの内容はフィールドの始めから終わりまでまたは空白以外の最後の文字まで調べられます。

SUBSTRING オプションを使用すると、フィールドの特定の部分のみを調べることができます。 SUBSTRING 節のフィールド名(operand1)の後に、まず開始位置(operand2)、次に調べるフィールド部分の長さ(operand3)を指定します。

例えば、フィールド #A の 5 番目から 12 番目を調べるには、次のように指定します。

EXAMINE SUBSTRING(#A,5,8).

注意:

  1. operand2 を省略すると、開始位置は "1" と見なされます。
  2. operand3 を省略すると、長さはフィールドの開始位置から終わりまでと見なされます。
  3. SUBSTRINGDYNAMIC 変数と一緒に使用すると、フィールドは固定長変数と同様に動作します。つまり、DELETE または REPLACE 操作が実行されたかどうかに関係なく、EXAMINE 操作の結果として長さ(*LENGTH)が変更されることはありません。
PATTERN

"ワイルドカード文字"(調べる対象から除外する位置を示す記号)を含む値でフィールドを調べる場合は、PATTERN オプションを使用します。 operand4 では、無視する位置に次の記号を挿入できます。

  • ピリオド(.)、疑問符(?)、下線(_)は、調べる対象から除外する位置が単一の位置であることを示します。

  • アスタリスク(*)、パーセント記号(%)は、調べる対象から除外する位置の数がいくつでもよいことを示します。

例:PATTERN 'NAT*AL' で、"NAT" と "AL" を含む、任意の値のフィールドを調べることができます。この場合、"NAT" と "AL" の間は、何文字でも許可されます。つまり、"NATURAL" や "NATIONAL" も "NATAL" と同じ結果になります。

DELIMITERS-option このオプションは、デリミタを示す値を検索するために使用します。 詳細については、下記の「DELIMITERS オプション」を参照してください。
DELETE-REPLACE-clause この節の DELETE オプションは、operand1 で見つかった各検索値(operand4)を削除するために使用します。一方、REPLACE オプションは、operand6 で指定した値によって operand1 で見つかった各検索値(operand4)を置換するために使用します。 詳細については、下記の「DELETE REPLACE 節」を参照してください。
GIVING-clause 詳細については、下記の「GIVING 節」を参照してください。

DIRECTION 節

方向節では、検索方向を決めます。

 

FORWARD

DIRECTION BACKWARD
  operand8

オペランド定義テーブル:

オペランド 構文要素 フォーマット オペランド参照 ダイナミック定義
operand8 C S       A1                       不可

構文要素の説明:

FORWARD FORWARD を指定すると、フィールドの内容は左から右へ向かって調べられます。
BACKWARD BACKWARD を指定すると、フィールドの内容は右から左へ向かって調べられます。
operand8 operand8 を指定すると、検索方向は operand8 の内容によって決まります。 operand8 は A1 のフォーマット/長さで定義する必要があります。 operand8 に "F" が含まれている場合、検索方向は FORWARD になります。operand8 に "B" が含まれている場合、検索方向は BACKWARD になります。" 他の値はすべて無効であり、operand8 が定数であればコンパイル時に、operand8 が変数であれば実行時に排除されます。

注意:
DIRECTION 節を指定しない場合、デフォルトの方向は FORWARD になります。

POSITION 節

POSITION 節は、operand1(または operand1 のサブストリング)内の調査の開始位置と終了位置を指定するために使用できます。

[[STARTING] FROM [POSITION] operand9]

ENDING AT

[POSITION] operand10

THRU

オペランド定義テーブル:

オペランド 構文要素 フォーマット オペランド参照 ダイナミック定義
operand9 C S         N P I                 不可
operand10 C S         N P I                 不可

構文要素の説明:

FROM operand9 operand9 では、調査の開始位置を指定します。
ENDING AT / THROUGH operand10 operand10 では、調査の終了位置を指定します。

開始位置(operand9)と終了位置(operand10)は operand1 または operand1 のサブストリングに関連しており、いずれも処理されます。

検索は開始位置から始まり、終了位置で終わります。

開始および(または)終了位置が指定されない場合、デフォルト値が適用されます。 この値は、検索方向によって決定されます。

方向 デフォルト開始位置 デフォルト終了位置
FORWARD 1(最初の文字) operand1 の長さ(最後の文字)
BACKWARD operand1 の長さ(最後の文字) 1(最初の文字)

この解決策で、EXAMINE BACKWARD ... は、EXAMINE BACKWARD ... FROM *LENGTH(...) THRU 1 と同じであり、予期したとおりに動作します。

注意:
検索方向が FORWARD で開始位置が終了位置を超えている場合、または検索方向が BACKWARD で開始位置が終了位置未満の場合、検索は実行されません。

DELIMITERS オプション

ABSOLUTE

[WITH DELIMITERS]
[WITH DELIMITERS] operand5

オペランド定義テーブル:

オペランド 構文要素 フォーマット オペランド参照 ダイナミック定義
operand5 C S       A         B             不可

構文要素の説明:

ABSOLUTE これはデフォルトのオプションです。 このオプションを指定すると、値が他のどんな文字に囲まれていても、フィールドに対して指定値の絶対検索が行われます。
WITH DELIMITERS 空白または英数字以外の文字で区切られた値を検索するために使用します。
WITH DELIMITERS operand5 operand5 で指定した文字(列)で区切られた値を検索するために使用します。

DELETE-REPLACE 節

[AND]

DELETE [FIRST]

REPLACE [FIRST] [WITH] [FULL [VALUE [OF]]] operand6

オペランド定義テーブル:

オペランド 構文要素 フォーマット オペランド参照 ダイナミック定義
operand6 C S A     A  U       B             不可

構文要素の説明:

DELETE operand1 の内容から、検索値(operand4)の最初(またはすべて)のオカレンスを削除するために使用します。
REPLACE operand1 にある検索値(operand4)の最初(またはすべて)のオカレンスを、operand6 で指定した値に置換します。
FIRST キーワード FIRST を指定すると、最初の同じ値のみを削除または置換できます。

注意:

  1. REPLACE 操作の結果が operand1 に入り切らない場合は、エラーメッセージが返されます。
  2. operand1 がダイナミック変数である場合は、REPLACE 操作でフィールドの長さを拡張または縮小できます。また、DELETE 操作で、フィールド長を "0" に設定することもできます。 ダイナミック変数の現在の長さは、システム変数 *LENGTH を使用して確認できます。 ダイナミック変数の一般的な情報については、「ダイナミック変数の使用」を参照してください。

operand6

operand4 および operand6 を 1、2、または 3 次元配列として定義し、n:m 置換を実現するためのテーブルとして使用することもできます。 operand4 はソースで、operand6 は出力置換テーブルです。operand6 から operand4 へのデータ転送が有効(operand4:=operand6)である場合、 operand4operand6 は有効な参照です。 いずれの置換テーブルも、次元ごとのインデックス値の昇順に処理されます。

ソース置換テーブル(operand4)の 1 番目の文字列から始めて、operand1 を検索文字列で検索します。 一致した場合、検索文字列は出力置換テーブル(operand6)の対応する文字列によって置換されます。 一致しなかった場合は、一致するまで operand1 の検索が文字列に対して継続されます。 ソーステーブルの 1 番目の文字列が、operand1 の置換された文字列の直後に始まる次の検索に使用されます。

各文字(列)は 1 回だけ文字(列)で置換されます。 つまり、置換された各文字(列)が 2 回置換されることはありません。 置換テーブルをとおしての検索は、一致する文字(列)が見つかるとすぐに終了します。 ランタイムエラーが発生した場合、ソースオペランドは変更されません。

例:

この例では、より小、より大、およびアンパサンド文字に対する HTML 変換を示します。

DEFINE DATA LOCAL
1 #HTML  (A/1:3) DYNAMIC INIT <"&lt;", "&gt;", "&amp;">  
1 #TAB   (A/1:3) DYNAMIC INIT <"<", ">","&">
1 #DOC(A) DYNAMIC  /* document to be replaced 
END-DEFINE
#DOC := "a&lt;&lt;b&amp;b&gt;c&gt;"
WRITE #DOC (AL=30) 'before'
/* Replace #DOC using #HTML to #TAB (n:1 replacement)
EXAMINE   #DOC FOR  #HTML(*)  REPLACE  #TAB(*)  
/* "&lt;"  is replaced by "< " (4:1 replacement)
/* "&gt;"  is replaced by ">"  (4:1 replacement)
/* "&amp;" is replaced by "&"  (5:1 replacement)
WRITE #DOC (AL=30) 'after'
END

GIVING 節

GIVING      

   

 

NUMBER

   
[GIVING] POSITION [IN] operand7
  LENGTH    
  [GIVING]   INDEX     [IN] operand7...3

オペランド定義テーブル:

オペランド 構文要素 フォーマット オペランド参照 ダイナミック定義
operand7   S         N P I                

構文要素の説明:

GIVING キーワード GIVING だけを指定した場合、これは GIVING NUMBER(デフォルト)に相当します。
NUMBER 内容を調べるフィールド(operand1)で検索値(operand4)が見つかった回数を取得するために使用します。
POSITION operand1(または operand1 のサブストリング)内で operand4 と同じ値が初めて出現したバイト位置を取得するために使用します。
LENGTH すべての削除または置換操作が完了した後の operand1(または operand1 のサブストリング)に残っている内容の長さを取得するために使用します。 末尾にある空白は無視されます。
operand7 検索値のオカレンス数を指定します。 REPLACE FIRST または DELETE FIRST オプションを同時に使用する場合は、1 を超えないようにする必要があります。
INDEX operand7...3 下記を参照してください。

GIVING INDEX

[GIVING] INDEX [IN] operand7 3

このオプションは、調べられる基礎のフィールドが配列フィールドの場合にのみ適用できます。

構文要素の説明:

INDEX GIVING INDEX は、最初の検索値(operand4)が見つかった operand1 の配列オカレンス番号(インデックス)を取得するために使用します。
operand7...3 operand1 の数(最大 3 個)は、 operand7 の次元数と一致させる必要があります。検索値がどのオカレンスでも見つからなかった場合、 operand7 には "0" が入ります。

注意:
operand1 のインデックス範囲にオカレンス 0(0:5 など)が含まれている場合、operand7 の "0" 値は正確ではありません。 この場合、GIVING NUMBER 節を追加して検索値が実際に見つかったかどうかを明確にする必要があります。

Top of page

構文 2 - EXAMINE TRANSLATE

EXAMINE

operand1

[AND]
SUBSTRING (operand1,operand2,operand3)
    TRANSLATE

INTO

UPPER

[CASE]

 
    LOWER  
    USING [INVERTED] (operand4)  

構文図で使用されている記号については、「構文記号」を参照してください。

構文説明 - 構文 2

EXAMINE TRANSLATE ステートメントでは、フィールド内の文字を大文字や小文字、または他の文字に変換します。

オペランド定義テーブル:

オペランド 構文要素 フォーマット オペランド参照 ダイナミック定義
operand1   S A     A         B             不可
operand2 C S         N P I   B*             不可
operand3 C S         N P I   B*             不可
operand4   S A     A         B             不可

*operand2 および operand3 のフォーマット B は、4 以下の長さでのみ使用できます。

構文要素の説明:

EXAMINE operand1
フィールド内容の全体の変換:

operand1 で指定したフィールドの内容が変換されます。

EXAMINE SUBSTRING operand1 operand2 operand3
フィールド内容の一部分の変換:

通常は、フィールドの内容全体が変換されます。

SUBSTRING オプションを指定すると、フィールドの特定の部分のみが変換されます。 SUBSTRING 節のフィールド名(operand1)の後に、まず開始位置(operand2)、次に調べるフィールド部分の長さ(operand3)を指定します。

例えば、フィールド #A の 5 番目から 12 番目を変換する場合は、次のように指定します。

EXAMINE SUBSTRING(#A,5,8) AND TRANSLATE ...

注意:
operand2 を省略すると、開始位置は "1" と見なされます。 operand3 を省略すると、長さはフィールドの開始位置から終わりまでと見なされます。

TRANSLATE INTO UPPER CASE
大文字変換:

operand1 の内容が大文字に変換されます。

TRANSLATE INTO LOWER CASE
小文字変換:

operand1 の内容が小文字に変換されます。

TRANSLATE USING operand4
使用する変換テーブル:

operand4 は、文字変換に使用する変換テーブルです。 テーブルのフォーマット/長さは、A2 または B2 にする必要があります。

注意:
変換される文字に対して変換テーブルで複数の変換が定義されている場合は、最後の変換が適用されます。

INVERTED キーワード INVERTED を指定すると、変換テーブル(operand4)は逆に使用されます。つまり、変換の方向が逆転します。

Top of page

構文 3 - Unicode 書記素用の EXAMINE

EXAMINE [FULL [VALUE [OF]]]

operand1

SUBSTRING(operand1,operand2,operand3)
[POSITION-clause]  
[FOR]

CHARPOSITIONoperand4 CHARLENGTH operand5
CHARPOSITION operand4
CHARLENGTH operand5

[GIVING] POSITION IN operand6 [[GIVING] LENGTH IN operand7]

構文図で使用されている記号については、「構文記号」を参照してください。

構文説明 - 構文 3

"grapheme" は、ユーザーが一般に文字と見なすものです。 ほとんどの場合、UTF-16 コード単位(= U 形式文字)が書記素になりますが、書記素は複数のコード単位で構成されることもあります。 例えば、一連の基本文字の後に、結合文字またはサロゲートペアが続きます。 書記素および他の Unicode 用語の詳細については、http://www.unicode.org/ にある『The Unicode Standard』を参照してください。

U 形式オペランド用の EXAMINE ステートメントは、通常、コード単位に対して機能します。 ただし、CHARPOSITION および CHARLENGTH 節を使用している場合は、書記素シーケンスの開始位置と長さ(コード単位での)を取得できます。 返されるコード単位の値は、コード単位のオペランドを必要とする他のステートメントまたは節で使用できます(例:SUBSTRING 節)。

EXAMINE ステートメントのこの構文に関する詳細については、「Natural プログラミング言語での Unicode およびコードページのサポート」の「ステートメント」セクションと「EXAMINE」セクションも参照してください。

オペランド定義テーブル:

オペランド 構文要素 フォーマット オペランド参照 ダイナミック定義
operand1 C S A     U         B             不可
operand2 C S         N P I   B*             不可
operand3 C S         N P I   B*             不可
operand4 C S A       N P I                 不可
operand5 C S A       N P I                 不可
operand6 C S         N P I                 不可
operand7 C S         N P I                 不可

* operand2 および operand3 のフォーマット B は、4 以下の長さでのみ使用できます。

構文要素の説明:

FULL オペランドに FULL を指定すると、末尾の空白も含めて値全体が処理されます。 FULL を指定しない場合は、オペランド内の末尾の空白は無視されます。
SUBSTRING operand1 operand2 operand3

通常、フィールドの内容はフィールドの始めから終わりまでまたは空白以外の最後の文字まで調べられます。

SUBSTRING オプションを使用すると、フィールドの特定の部分のみを調べることができます。 SUBSTRING 節のフィールド名(オペランド1)の後に、まず開始位置(operand2)、次に調べるフィールド部分の長さ(operand3)を指定します。 operand2operand3 は、コード単位で指定します。

例えば、フィールド #A の 5 番目から 12 番目を調べるには、次のように指定します。

EXAMINE SUBSTRING (#A,5,8)

注意:

  1. operand2 を省略すると、開始位置は "1" と見なされます。
  2. operand3 を省略すると、長さはフィールドの開始位置から終わりまでと見なされます。
  3. SUBSTRINGDYNAMIC 変数と一緒に使用すると、フィールドは固定長変数と同様に動作します。つまり、DELETE または REPLACE 操作が実行されたかどうかに関係なく、EXAMINE 操作の結果として長さ(*LENGTH)が変更されることはありません。
POSITION-clause FROMTHRU の位置は、コード単位で指定します。 詳細については、「構文 1」の POSITION 節 を参照してください。
CHARPOSITION operand4 operand4 では、書記素シーケンスの開始位置(Unicode 書記素)を定義します。 対応する位置(コード単位)が、operand6 で返されます。 CHARLENGTH 節が指定されている場合は、この節を省略できます。その場合、開始位置は 1 とみなされます。
CHARLENGTH operand5 operand5 では、書記素シーケンスの長さ(Unicode 書記素)を定義します。 書記素シーケンスの長さ(コード単位)が、operand7 で返されます。 CHARPOSITION 節が指定されている場合は、この節を省略できます。その場合は、開始位置から文字列の末尾までの長さが返されます。
GIVING POSITION IN operand6 operand6 は、operand4operand5 によって定義された書記素シーケンスの開始位置(コード単位)を受け取ります。 オペランド 1 が operand4 書記素よりも小さい場合は、0 が返されます。 GIVING LENGTH 節が指定されている場合は、この節を省略できます。
GIVING LENGTH IN operand7 operand7 は、operand4operand5 によって定義された書記素シーケンスの長さ(コード単位)を受け取ります。 operand1operand4+operand5 書記素よりも小さい場合は、0 が返されます。 GIVING POSITION 節が指定されている場合は、この節を省略できます。

注意:

  1. CHARPOSITIONCHARLENGTH 節の一方または両方を指定する必要があります。
  2. GIVING POSITIONGIVING LENGTH 節の一方または両方を指定する必要があります。

Top of page

例 1 - EXAMINE

** Example 'EXMEX1': EXAMINE                                            
************************************************************************
DEFINE DATA LOCAL                                                       
1 #TEXT   (A40)                                                         
1 #A      (A1)                                                          
1 #START  (N2)                                                          
1 #NMB1   (N2)                                                          
1 #NMB2   (N2)                                                          
1 #NMB3   (N2)                                                          
1 #NMBEX2 (N2)                                                          
1 #NMBEX3 (N2)                                                          
1 #NMBEX4 (N2)                                                          
1 #POSEX5 (N2)                                                          
1 #LGHEX6 (N2)                                                          
1 #NMBEX7 (N2)                                                          
1 #NMBEX8 (N2)                                                          
END-DEFINE                                                              
*                                                                       
WRITE 'EXAMPLE 1 (GIVING NUMBER, WITH DELIMITER)'
MOVE 'ABC   A B C   .A.  .B.  .C.    -A-  -B-  -C- ' TO #TEXT
ASSIGN #A = 'A'                                              
EXAMINE #TEXT FOR #A GIVING NUMBER #NMB1                     
EXAMINE #TEXT FOR #A WITH DELIMITER GIVING NUMBER #NMB2      
EXAMINE #TEXT FOR #A WITH DELIMITER '.' GIVING NUMBER #NMB3  
WRITE NOTITLE '=' #NMB1 '=' #NMB2 '=' #NMB3                  
*                                                            
WRITE / 'EXAMPLE 2 (WITH DELIMITER, REPLACE, GIVING NUMBER)' 
WRITE '=' #TEXT                                              
EXAMINE #TEXT FOR #A WITH DELIMITER '-' REPLACE WITH '*'     
        GIVING NUMBER #NMBEX2                                
WRITE '=' #TEXT '=' #NMBEX2                                  
*                                                            
WRITE / 'EXAMPLE 3 (REPLACE, GIVING NUMBER)'                 
WRITE '=' #TEXT                                              
EXAMINE #TEXT ' ' REPLACE WITH '+' GIVING NUMBER #NMBEX3     
WRITE '=' #TEXT '=' #NMBEX3                                  
*                                                            
WRITE / 'EXAMPLE 4 (FULL, REPLACE, GIVING NUMBER)'           
WRITE '=' #TEXT                                              
EXAMINE FULL #TEXT ' ' REPLACE WITH '+' GIVING NUMBER #NMBEX4
WRITE '=' #TEXT '=' #NMBEX4                                  
*                                                            
WRITE / 'EXAMPLE 5 (DELETE, GIVING POSITION)'                
WRITE '=' #TEXT                                              
EXAMINE #TEXT '+' DELETE GIVING POSITION #POSEX5             
WRITE '=' #TEXT '=' #POSEX5                                  
*                                                            
WRITE / 'EXAMPLE 6 (DELETE, GIVING LENGTH)'                  
WRITE '=' #TEXT                                              
EXAMINE #TEXT FOR 'A' DELETE GIVING LENGTH #LGHEX6           
WRITE '=' #TEXT '=' #LGHEX6                                  
*                                                            
*                                                            
NEWPAGE                                                      
*                                                            
MOVE 'ABC   A B C   .A.  .B.  .C.    -A-  -B-  -C- ' TO #TEXT
*                                                            
ASSIGN #A = 'A B C'                                           
ASSIGN #START = 6                                             
*                                                             
WRITE / 'EXAMPLE 7 (SUBSTRING, GIVING NUMBER)'                
WRITE '=' #TEXT                                               
EXAMINE SUBSTRING(#TEXT,#START,9) FOR #A GIVING NUMBER #NMBEX7
WRITE '=' #TEXT '=' #NMBEX7                                   
*                                                             
WRITE / 'EXAMPLE 8 (PATTERN, GIVING NUMBER)'                  
WRITE '=' #TEXT                                               
EXAMINE #TEXT FOR PATTERN '-A-' GIVING NUMBER #NMBEX8         
WRITE '=' #TEXT '=' #NMBEX8                                   
*                                                             
END

プログラム EXMEX1 の出力:

EXAMPLE 1 (GIVING NUMBER, WITH DELIMITER)                   
#NMB1:   4 #NMB2:   3 #NMB3:   1                            
                                                            
EXAMPLE 2 (WITH DELIMITER, REPLACE, GIVING NUMBER)          
#TEXT: ABC   A B C   .A.  .B.  .C.    -A-  -B-              
#TEXT: ABC   A B C   .A.  .B.  .C.    -*-  -B-  #NMBEX2:   1
                                                            
EXAMPLE 3 (REPLACE, GIVING NUMBER)                          
#TEXT: ABC   A B C   .A.  .B.  .C.    -*-  -B-              
#TEXT: ABC+++A+B+C+++.A.++.B.++.C.++++-*-++-B-  #NMBEX3:  18
                                                            
EXAMPLE 4 (FULL, REPLACE, GIVING NUMBER)                    
#TEXT: ABC+++A+B+C+++.A.++.B.++.C.++++-*-++-B-              
#TEXT: ABC+++A+B+C+++.A.++.B.++.C.++++-*-++-B-+ #NMBEX4:   1
                                                            
EXAMPLE 5 (DELETE, GIVING POSITION)                         
#TEXT: ABC+++A+B+C+++.A.++.B.++.C.++++-*-++-B-+             
#TEXT: ABCABC.A..B..C.-*--B-                    #POSEX5:   4
                                                            
EXAMPLE 6 (DELETE, GIVING LENGTH)                           
#TEXT: ABCABC.A..B..C.-*--B-                                
#TEXT: BCBC...B..C.-*--B-                       #LGHEX6:  18

例 2 - EXAMINE SUBSTRING、PATTERN、TRANSLATE

** Example 'EXMEX2': EXAMINE TRANSLATE                                  
************************************************************************
DEFINE DATA LOCAL                                                       
1 #TEXT  (A50)                                                          
1 #TAB   (A2/1:10)                                                      
1 #START (N2)                                                           
END-DEFINE                                                              
*                                                                       
MOVE 'ABC   A B C   .A.  .B.  .C.    -A-  -B-  -C- ' TO #TEXT           
*                                                                       
MOVE 'AX' TO #TAB(1)                                                    
MOVE 'BY' TO #TAB(2)                                                    
MOVE 'CZ' TO #TAB(3)                                                    
*                                                                       
*                                                                       
WRITE 'EXAMPLE 1 (USING TRANSLATION TABLE)'                             
WRITE '=' #TEXT                                                         
EXAMINE #TEXT TRANSLATE USING #TAB(*)                                   
WRITE NOTITLE '=' #TEXT 
*                                                           
WRITE / 'EXAMPLE 2 (USING INVERTED TRANSLATION TABLE)'      
WRITE '=' #TEXT                                             
EXAMINE #TEXT TRANSLATE USING INVERTED #TAB(*)              
WRITE NOTITLE '=' #TEXT                                     
*                                                           
WRITE / 'EXAMPLE 3 (USING SUBSTRING, LOWER CASE)'           
WRITE '=' #TEXT                                             
ASSIGN #START = 13                                          
EXAMINE SUBSTRING(#TEXT,#START,15) TRANSLATE INTO LOWER CASE
WRITE '=' #TEXT                                             
END

プログラム EXMEX2 の出力:

EXAMPLE 1 (USING TRANSLATION TABLE)                
#TEXT: ABC   A B C   .A.  .B.  .C.    -A-  -B-  -C-
#TEXT: XYZ   X Y Z   .X.  .Y.  .Z.    -X-  -Y-  -Z-
                                                   
EXAMPLE 2 (USING INVERTED TRANSLATION TABLE)       
#TEXT: XYZ   X Y Z   .X.  .Y.  .Z.    -X-  -Y-  -Z-
#TEXT: ABC   A B C   .A.  .B.  .C.    -A-  -B-  -C-
                                                   
EXAMPLE 3 (USING SUBSTRING, LOWER CASE)            
#TEXT: ABC   A B C   .A.  .B.  .C.    -A-  -B-  -C-
#TEXT: ABC   A B C   .a.  .b.  .c.    -A-  -B-  -C-

例 3 - EXAMINE TRANSLATE

** Example 'EXMEX2': EXAMINE TRANSLATE                                  
************************************************************************
DEFINE DATA LOCAL                                                       
1 #TEXT  (A50)                                                          
1 #TAB   (A2/1:10)                                                      
1 #START (N2)                                                           
END-DEFINE                                                              
*                                                                       
MOVE 'ABC   A B C   .A.  .B.  .C.    -A-  -B-  -C- ' TO #TEXT           
*                                                                       
MOVE 'AX' TO #TAB(1)                                                    
MOVE 'BY' TO #TAB(2)                                                    
MOVE 'CZ' TO #TAB(3)                                                    
*                                                                       
*                                                                       
WRITE 'EXAMPLE 1 (USING TRANSLATION TABLE)'                             
WRITE '=' #TEXT                                                         
EXAMINE #TEXT TRANSLATE USING #TAB(*)                                   
WRITE NOTITLE '=' #TEXT 
*                                                           
WRITE / 'EXAMPLE 2 (USING INVERTED TRANSLATION TABLE)'      
WRITE '=' #TEXT                                             
EXAMINE #TEXT TRANSLATE USING INVERTED #TAB(*)              
WRITE NOTITLE '=' #TEXT                                     
*                                                           
WRITE / 'EXAMPLE 3 (USING SUBSTRING, LOWER CASE)'           
WRITE '=' #TEXT                                             
ASSIGN #START = 13                                          
EXAMINE SUBSTRING(#TEXT,#START,15) TRANSLATE INTO LOWER CASE
WRITE '=' #TEXT                                             
END

プログラム EXMEX2 の出力:

EXAMPLE 1 (USING TRANSLATION TABLE)                
#TEXT: ABC   A B C   .A.  .B.  .C.    -A-  -B-  -C-
#TEXT: XYZ   X Y Z   .X.  .Y.  .Z.    -X-  -Y-  -Z-
                                                   
EXAMPLE 2 (USING INVERTED TRANSLATION TABLE)       
#TEXT: XYZ   X Y Z   .X.  .Y.  .Z.    -X-  -Y-  -Z-
#TEXT: ABC   A B C   .A.  .B.  .C.    -A-  -B-  -C-
                                                   
EXAMPLE 3 (USING SUBSTRING, LOWER CASE)            
#TEXT: ABC   A B C   .A.  .B.  .C.    -A-  -B-  -C-
#TEXT: ABC   A B C   .a.  .b.  .c.    -A-  -B-  -C-

例 4 - Unicode 書記素用の EXAMINE

この例では、文字 "ä" と "ü" を含む Unicode 文字列の分析を示します。 この 2 つの文字は基本文字として定義され、その後に結合文字が続きます。"ä" は U+0061 で、その後に U+0308 が続きます。また、"ü" のコードは U+0075 で、その後に U+0308 が続きます。

DEFINE DATA LOCAL                                         
1 #U (U20)                                                
1 #START (I2)                                             
1 #POS (I2)                                               
1 #LEN (I2)                                               
END-DEFINE                                                
#U := U'AB'-UH'00610308'-U'CD'-UH'00750308'-U'EF'         
*                                                         
REPEAT                                                    
  #START := #START + 1                                    
  EXAMINE #U FOR CHARPOSITION #START                      
                   CHARLENGTH      1                      
              GIVING POSITION IN #POS                     
                       LENGTH IN #LEN                     
*                                                         
  INPUT (AD=O) MARK POSITION #POS IN FIELD *#U            
    '         UNICODE-STRING:' #U     (AD=MI)             
 // '          CHARACTER NO.:' #START (EM=9)              
  / 'STARTS AT BYTE POSITION:' #POS   (EM=9)              
  / '      AND THE LENGTH IS:' #LEN   (EM=9)              
WHILE #POS NE 0                                           
END-REPEAT                                                
END 

出力:

メインフレーム環境: Windows、UNIX、および OpenVMS 環境(Web I/O インターフェイスでの出力):
         UNICODE-STRING: ABa?CDu?EF

          CHARACTER NO.: 1
STARTS AT BYTE POSITION: 1
      AND THE LENGTH IS: 1
         UNICODE-STRING: ABäCDüEF

          CHARACTER NO.: 1
STARTS AT BYTE POSITION: 1
      AND THE LENGTH IS: 1
Enter キーを押して続行します。 Enter キーを押して続行します。
         UNICODE-STRING: ABa?CDu?EF

          CHARACTER NO.: 2
STARTS AT BYTE POSITION: 2
      AND THE LENGTH IS: 1
         UNICODE-STRING: ABäCDüEF

          CHARACTER NO.: 2
STARTS AT BYTE POSITION: 2
      AND THE LENGTH IS: 1
Enter キーを押して続行します。 Enter キーを押して続行します。
位置 3 にある文字は結合文字シーケンスで、コード単位 2 個分の長さがあることに注意してください。
         UNICODE-STRING: AB<b>a</b>?CDu?EF

          CHARACTER NO.: 3
STARTS AT BYTE POSITION: 3
      AND THE LENGTH IS: 2
         UNICODE-STRING: AB<b>ä</b>CDüEF

          CHARACTER NO.: 3
STARTS AT BYTE POSITION: 3
      AND THE LENGTH IS: 2
以下、同様。 以下、同様。

Top of page