SCAN (掃描字串)
| 開放式語法 | (不容許-使用 %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。
- 從位置 1 檢索字串。
- 如果起始位置大於 1 ,則結果欄位包含比較字串相對於來源字串開頭的位置,而不是相對於起始位置。
- 無法在因數 1、因數 2 或結果欄位中使用比喻常數。
- 對於因數 1 及結果欄位或因數 2 及結果欄位,不容許在資料結構內重疊。
若要處理 SCAN 異常狀況 (程式狀態碼 100) ,可以指定作業碼擴充元 'E' 或錯誤指示器 ER ,但不能同時指定兩者。 如果起始位置大於因數 2 的長度,或因數 1 的值太大,則會發生錯誤。 如需錯誤處理的相關資訊,請參閱 程式異常狀況/錯誤。
如果找到要掃描的字串,您可以在設定的位置 75-76 中指定指示器。 也可以從 %FOUND 內建函數取得此資訊,如果找到相符項,則會傳回 '1'。
SCAN 從因數 2 的最左側字元開始 (由起始位置指定) ,並從左到右逐個字元繼續,將因數 2 中的字元與因數 1 中的字元進行比較。 如果結果欄位不是陣列,則 SCAN 作業只會尋找比較字串的第一個出現項目。 若要在第一個出現項目之後繼續掃描,請使用前一個 SCAN 作業的結果欄位來計算下一個 SCAN 的起始位置。 如果結果欄位是數值陣列,則會記錄陣列中元素的出現次數。 如果找不到任何出現項目,則結果欄位會設為零; 如果結果欄位是陣列,則其所有元素都會設為零。
SCAN 作業中包括比較字串中指定的前導、尾端或內嵌空白。
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 *...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