A relative positional pattern is a number with a plus (+) or minus (-) sign preceding it. (It can also be a
variable within parentheses, with a plus (+) or minus (-) sign preceding the left parenthesis; for details see
section “Parsing with Variable Patterns” on page 209.)
The number specifies the relative character position at which to split the source string. The plus or minus
indicates movement right or left, respectively, from the start of the string (for the first pattern) or from the
position of the last match. The position of the last match is the first character of the last match. Here is the
same example as for absolute positional patterns done with relative positional patterns:
/* Parsing with relative positional patterns in template */
record.1='Clemens Samuel Mark Twain '
record.2='Evans Mary Ann George Eliot '
record.3='Munro H.H. Saki '
do n=1 to 3
parse var record.n lastname +10 firstname + 10 pseudonym
If lastname='Evans' & firstname='Mary Ann' then say 'By George!'
end /* same results */
Blanks between the sign and the number are insignificant. Therefore, +10 and +10have the same
meaning. Note that +0 is a valid relative positional pattern.
Absolute and relative positional patterns are interchangeable (except in the special case (on page 212)
when a string pattern precedes a variable name and a positional pattern follows the variable name). The
templates from the examples of absolute and relative positional patterns give the same results.
│ │ │lastname 11│ │firstname 21 │ │ pseudonym │
│ │ │lastname +10│ │firstname + 10│ │ pseudonym │
└──┬───┘ └──────┬─────┘ └──────┬───────┘ └─────┬─────┘
││ │ │
(Implied Put characters Put characters Put characters
starting 1 through 10 11 through 20 21 through
point is in lastname. in firstname. end of string
position (Non─inclusive (Non─inclusive in pseudonym.
1.) stopping point stopping point
is 11 (1+10).) is 21 (11+10).)
Only with positional patterns can a matching operation back up to an earlier position in the source string.
Here is an example using absolute positional patterns:
/* Backing up to an earlier position (with absolute positional) */
string='astronomers'
parse var string 2 var1 4 1 var2 2 4 var3 5 11 var4
say string 'study' var1||var2||var3||var4
/* Displays: "astronomers study stars" */
The absolute positional pattern 1 backs up to the first character in the source string.
With relative positional patterns, a number preceded by a minus sign backs up to an earlier position. Here
is the same example using relative positional patterns:
/* Backing up to an earlier position (with relative positional) */
string='astronomers'
parse var string 2 var1 +2 -3 var2 +1 +2 var3 +1 +6 var4
say string 'study' var1||var2||var3||var4 /* same results */
In the previous example, the relative positional pattern -3 backs up to the first character in the source
string.
The templates in the last two examples are equivalent.
Parsing
Chapter 15. Parsing 207