IBM SC34-5764-01 User Manual

Page 234

Advertising
background image

This instruction consists of the keywords PARSE ARG and three comma-separated templates. (For an
ARG instruction, the source strings to parse come from arguments you specify when you call a program or
CALL a subroutine or function.) Each comma is an instruction to the parser to move on to the next string.

Example:

/* Parsing multiple strings in a subroutine

*/

num='3'
musketeers="Porthos Athos Aramis D'Artagnon"
CALL Sub num,musketeers

/* Passes num and musketeers to sub

*/

SAY total; say fourth /* Displays: "4" and " D'Artagnon"

*/

EXIT

Sub:
parse arg subtotal, . . . fourth
total=subtotal+1
RETURN

Note that when a REXX program is started as a command, only one argument string is recognized. You
can pass multiple argument strings for parsing:

v

When one REXX program calls another REXX program with the CALL instruction or a function call.

v

When programs written in other languages start a REXX program.

If there are more templates than source strings, each variable in a leftover template receives a null string.
If there are more source strings than templates, the language processor ignores leftover source strings. If
a template is empty (two commas in a row) or contains no variable names, parsing proceeds to the next
template and source string.

Combining String and Positional Patterns: A Special Case

There is a special case in which absolute and relative positional patterns do not work identically. We have
shown how parsing with a template containing a string pattern skips over the data in the source string that
matches the pattern (see page 205). But a template containing the sequence:
v

string pattern

v

variable name

v

relative positional pattern

does not skip over the matching data. A relative positional pattern moves relative to the first character
matching a string pattern. As a result, assignment includes the data in the source string that matches the
string pattern.

/* Template containing string pattern, then variable name, then

*/

/*

relative positional pattern does not skip over any data.

*/

string='REstructured eXtended eXecutor'
parse var string var1 3 junk 'X' var2 +1 junk 'X' var3 +1 junk
say var1||var2||var3 /* Concatenates variables; displays: "REXX" */

Here is how this template works:

│var1

3│

│junk 'X'│

│var2 +1│

│junk

'X'│

│var3 +1 │

│ junk │

└───┬───┘

└───┬────┘

└───┬───┘

└────┬────┘

└───┬────┘

└──┬───┘

Put

Starting

Starting

Starting

Starting

Starting

characters

at 3, put

with first

with char─

with

with char─

1 through

characters

'X' put 1

acter after

second 'X'

acter

2 in var1.

up to (not

(+1)

first 'X'

put 1 (+1)

after sec─

(Stopping

including)

character

put up to

character

ond 'X'

point is

first 'X'

in var2.

second 'X'

in var3.

put rest

3.)

in junk.

in junk.

in junk.

var1='RE'

junk=

var2='X'

junk=

var3='X'

junk=

'structured

'tended e'

'ecutor'

e'

Parsing

212

CICS TS for VSE/ESA: REXX Guide

Advertising