SCAN (掃描字串)

代碼 因素1 因素2 結果欄位 指示器
SCAN (E) 比較字串:length 基本字串:start 最左側位置 _ ER FD

SCAN 作業會掃描因數 2 中包含的字串 (基本字串) ,以找出因數 1 中包含的子字串 (比較字串)。 掃描從因數 2 中包含的指定位置開始,並繼續進行因數 1 中指定的比較字串長度。 比較字串和基本字串必須都是相同的類型,兩者都是字元、都是圖形,或都是 UCS-2。

「因數 1」必須包含比較字串或比較字串,後面接著冒號,後面接著長度。 因數 1 的比較字串部分可以包含下列其中一項: 欄位名稱、陣列元素、已命名常數、資料結構名稱、文字或表格名稱。 長度部分必須是不含小數位數的數值,且可以包含下列其中一項: 已命名常數、陣列元素、欄位名稱、文字或表格名稱。 如果未指定長度,則是比較字串的長度。

「因數 2」必須包含基本字串或基本字串,後面接著冒號,後面接著 SCAN 的開始位置。 因數 2 的基本字串部分可以包含下列其中一項: 欄位名稱、陣列元素、已命名常數、資料結構名稱、文字或表格名稱。 因數 2 的起始位置部分必須是不含小數位數的數值,且可以是已命名常數、陣列元素、欄位名稱、文字或表格名稱。 如果使用圖形或 UCS-2 字串,則會以雙位元組測量起始位置和長度。 如果未指定任何起始位置,則會使用值 1。

結果欄位包含基本字串中比較字串最左側位置的數值 (如果找到的話)。 它必須是不含小數位數的數值,且可以包含下列其中一項: 欄位名稱、陣列元素、陣列名稱或表格名稱。 如果找不到字串,則結果欄位會設為 0。 如果結果欄位包含陣列,則比較字串的每一個出現項目都會放在陣列中,而元素 1 中最左邊的出現項目則會放在陣列中。 包含最右側出現項目的元素後面的陣列元素都是零。 結果陣列應該與因數 2 中所指定基本字串的欄位長度一樣大。
附註:
  1. 從位置 1 檢索字串。
  2. 如果起始位置大於 1 ,則結果欄位包含比較字串相對於來源字串開頭的位置,而不是相對於起始位置。
  3. 無法在因數 1、因數 2 或結果欄位中使用比喻常數。
  4. 對於因數 1 及結果欄位或因數 2 及結果欄位,不容許在資料結構內重疊。

若要處理 SCAN 異常狀況 (程式狀態碼 100) ,可以指定作業碼擴充元 'E' 或錯誤指示器 ER ,但不能同時指定兩者。 如果起始位置大於因數 2 的長度,或因數 1 的值太大,則會發生錯誤。 如需錯誤處理的相關資訊,請參閱 程式異常狀況/錯誤

如果找到要掃描的字串,您可以在設定的位置 75-76 中指定指示器。 也可以從 %FOUND 內建函數取得此資訊,如果找到相符項,則會傳回 '1'。

SCAN 從因數 2 的最左側字元開始 (由起始位置指定) ,並從左到右逐個字元繼續,將因數 2 中的字元與因數 1 中的字元進行比較。 如果結果欄位不是陣列,則 SCAN 作業只會尋找比較字串的第一個出現項目。 若要在第一個出現項目之後繼續掃描,請使用前一個 SCAN 作業的結果欄位來計算下一個 SCAN 的起始位置。 如果結果欄位是數值陣列,則會記錄陣列中元素的出現次數。 如果找不到任何出現項目,則結果欄位會設為零; 如果結果欄位是陣列,則其所有元素都會設為零。

SCAN 作業中包括比較字串中指定的前導、尾端或內嵌空白。

SCAN 作業區分大小寫。 在大寫指定的基本字串中找不到小寫指定的比較字串。

如需相關資訊,請參閱 字串作業

圖 1. SCAN 作業
*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
 *
 * The SCAN operation finds the substring 'ABC' starting in
 * position 3 in factor 2;  3 is placed in the result field.
 * Indicator 90 is set on because the string is found.  Because
 * no starting position is specified, the default of 1 is used.
C     'ABC'         SCAN      'XCABCD'      RESULT                   90
 *
 * This SCAN operation scans the string in factor 2 for an
 * occurrence of the string in factor 1 starting at position 3.
 * The 'Y' in position 1 of the base string is ignored because
 * the scan operation starts from position 3.
 * The operation places the values 5 and 6 in the first and
 * second elements of the array.  Indicator 90 is set on.
C
C                   MOVE      'YARRYY'      FIELD1            6
C                   MOVE      'Y'           FIELD2            1
C     FIELD2        SCAN      FIELD1:3      ARRAY                    90
 *
 * This SCAN operation scans the string in factor 2, starting
 * at position 2, for an occurrence of the string in factor 1
 * for a length of 4.  Because 'TOOL' is not found in FIELD1,
 * INT is set to zero and indicator 90 is set off.
C
C                   MOVE      'TESTING'     FIELD1            7
C                   Z-ADD     2             X                 1 0
C                   MOVEL     'TOOL'        FIELD2            5
C     FIELD2:4      SCAN      FIELD1:X      INT90            20
C
 *
 * The SCAN operation is searching for a name.  When the name
 * is found, %FOUND returns '1' so HandleLine is called.
C     SrchName      SCAN      Line
C                   IF        %FOUND
C                   EXSR      HandleLine
C                   ENDIF                
圖 2. 使用圖形的 SCCAN 作業
*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
DName+++++++++++ETDsFrom+++To/L+++IDc.Functions+++++++++++++++++++++++++
 *
 *       A Graphic SCAN example
 *
 *       Value of Graffld is graphic 'AACCBBGG'.
 *       Value of Number after the scan is 3 as the 3rd graphic
 *       character matches the value in factor 1
D Graffld       S              4G   inz(G'oAACCBBGGi')
CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq..
 * The SCAN operation scans the graphic string in factor 2 for
 * an occurrence of the graphic literal in factor 1. As this is a
 * graphic operation, the SCAN will operate on 2 bytes at a time
C
C     G'oBBi'       SCAN      Graffld:2     Number            5 0    90
C