HP OpenVMS Systems Documentation |
HP COBOL
|
Previous | Contents | Index |
The TALLYING operation, which counts certain characters in the item, and the REPLACING operation, which replaces certain characters in the item, can be applied either to the characters in the delimited area of the item being inspected, or to only those characters that match a given character string or strings under stated conditions. Consider the following sample statements, both of which cause a scan of the complete item:
INSPECT FIELD1 TALLYING TLY FOR ALL "B". INSPECT FIELD1 REPLACING ALL SPACE BY ZERO. |
The first statement causes the compiler to scan FIELD1 looking for the character B. Each time a B is found, TLY is incremented by 1.
The second statement causes the compiler to scan FIELD1 looking for spaces. Each space found is replaced with a zero.
The TALLYING and REPLACING phrases support both single and multiple arguments. For example, both of the following statements are valid:
INSPECT FIELD1 TALLYING TLY FOR ALL "A" "B" "C". INSPECT FIELD1 REPLACING ALL "A" "B" "C" BY "D". |
You can use both the TALLYING and REPLACING phrases in the same INSPECT
statement. However, when used together, the TALLYING phrase must
precede the REPLACING phrase. An INSPECT statement with both phrases is
equivalent to two separate INSPECT statements. In fact, the compiler
compiles such a statement into two distinct INSPECT statements. To
simplify debugging, write the two phrases in separate INSPECT
statements.
5.3.2 Restricting Data Inspection Using the BEFORE/AFTER Phrase
The BEFORE/AFTER phrase acts as a delimiter and can restrict the area of the item being inspected.
The following sample statement counts only the zeros that precede the percent sign (%) in FIELD1:
INSPECT FIELD1 TALLYING TLY FOR ALL ZEROS BEFORE "%". |
The delimiter (the percent sign in the preceding sample statement) can be a single character, a string of characters, or any figurative constant. Furthermore, it can be either an identifier or a literal.
The compiler repeatedly compares the delimiter characters against an equal number of characters in the item being inspected. If none of the characters matches the delimiter, or if too few characters remain in the rightmost position of the item for a full comparison, the compiler considers the comparison to be unequal.
The examples of the INSPECT statement in Figure 5-2 illustrate the way the delimiter character finds a match in the item being inspected. The underlined characters indicate the portion of the item the statement inspects as a result of the delimiters of the BEFORE and AFTER phrases. The remaining portion of the item is ignored by the INSPECT statement.
Figure 5-2 Matching Delimiter Characters to Characters in a Field
The ellipses represent the position of the TALLYING or REPLACING
phrase. The compiler generates code that scans the item for a delimiter
match before it scans for the inspection operation (TALLYING or
REPLACING), thus establishing the limits of the operation before
beginning the actual inspection. Section 5.3.4.1 further describes the
separate scan.
5.3.3 Implicit Redefinition
The compiler requires that certain items referred to by the INSPECT statement be alphanumeric items. If one of these items is described as another data class, the compiler implicitly redefines that item so the INSPECT statement can handle it as an alphanumeric string as follows:
The compiler alters the digit position containing the sign before beginning the INSPECT operation and restores it to its former value after the operation. If the sign's digit position does not contain a valid ASCII signed numeric digit, redefinition causes the value to change.
Table 5-10 shows these original, altered, and restored values.
The compiler never moves an implicitly redefined item from its storage position. All redefinition occurs in place.
The position of an implied decimal point on numeric quantities does not affect implicit redefinition.
Original Value | Altered Value | Restored Value |
---|---|---|
} (173) | 0 (60) | } (173) |
A (101) | 1 (61) | A (101) |
B (102) | 2 (62) | B (102) |
C (103) | 3 (63) | C (103) |
D (104) | 4 (64) | D (104) |
E (105) | 5 (65) | E (105) |
F (106) | 6 (66) | F (106) |
G (107) | 7 (67) | G (107) |
H (110) | 8 (70) | H (110) |
I (111) | 9 (71) | I (111) |
{ (175) | 0 (60) | { (175) |
J (112) | 1 (61) | J (112) |
K (113) | 2 (62) | K (113) |
L (114) | 3 (63) | L (114) |
M (115) | 4 (64) | M (115) |
N (116) | 5 (65) | N (116) |
O (117) | 6 (66) | O (117) |
P (120) | 7 (67) | P (120) |
Q (121) | 8 (70) | Q (121) |
R (122) | 9 (71) | R (122) |
0 (60) | 0 (60) | } (173) |
1 (61) | 1 (61) | A (101) |
2 (62) | 2 (62) | B (102) |
3 (63) | 3 (63) | C (103) |
4 (64) | 4 (64) | D (104) |
5 (65) | 5 (65) | E (105) |
6 (66) | 6 (66) | F (106) |
7 (67) | 7 (67) | G (107) |
8 (70) | 8 (70) | H (110) |
9 (71) | 9 (71) | I (111) |
All other values | 0 (60) | } (173) |
Previous | Next | Contents | Index |