Я просто хочу добавить еще немного к ответу Дэуяна.Я согласен, что переменные REXX являются ответом.
Простые переменные REXX по умолчанию имеют собственное имя.Например:
/* REXX */
SAY X
будет печатать «X», пока X
не будет присвоено какое-либо другое значение:
/* REXX */
X = 'A'
SAY X
выведет «A».
Не большойпока что сюрприз.Переменные основы немного отличаются.Головка стебля никогда не оценивается, только бит после начальной точки.
Для иллюстрации:
/* REXX */
X. = 'empty' /* all unassigned stem values take on this value */
A. = 'nil'
B = 'A' /* simple variable B is assigned value A */
X = 'A' /* simple variable X is assigned value A */
SAY X.A /* prints: empty */
X.A = 'hello' /* Stem X. associates value of A with 'hello' */
SAY X.A /* prints: hello */
SAY X.B /* prints: hello */
SAY X.X /* prints: hello */
Обратите внимание, что имена X
и A
не являютсяоцениваются, однако, переменные X
и A
, появляющиеся после них.Некоторые люди находят это немного запутанным - подумайте об этом некоторое время, и это имеет большой смысл.
Версия REXX для Z / OS не обеспечивает естественного способа перебора переменной основы.Самый простой способ сделать это - создать свой собственный индекс.Например:
/* REXX */
X. = ''
DO I = 1 TO 10
J = RANDOM(100, 500) /* Random # 100..500 */
X.INDEX = X.INDEX J /* concatinate J's with 1 space between */
X.J = 'was picked' /* Associate 'was picked' with whatever J evalauates to */
END
DO I = 1 TO WORDS(X.INDEX) /* Number of blank delimited 'words' */
J = WORD(X.INDEX, I) /* Extract 1 'word' at a time */
SAY J X.J /* Print 'word' and its associated value */
END
Довольно тривиально, но иллюстрирует идею.Просто убедитесь, что INDEX
(или любое другое имя) для хранения имен индексации никогда не появится как ассоциативное значение!Если это возможно, используйте другую переменную для хранения индекса.
Последняя точка.Обратите внимание, что каждый из моих примеров начинается с /* REXX */
, вы можете обнаружить, что это должна быть первая строка ваших программ REXX под Z / OS.