Есть ли способ сделать ассоциативные массивы в Rexx?
-
28-09-2019 - |
Вопрос
У меня есть какой-то код Perl (для анализа производительности), впервые разработанный под Linux, который теперь должен быть перенесен на мэйнфрейм. По-видимому, Rexx - это язык сценариев выбора на этой платформе, но этот сценарий Perl сильно зависит от ассоциативных массивов (в основном массивы, где индекс является строкой).
Есть ли способ, что в Rexx? Как бы я кодирую что-то вроде:
$arr{"Pax"} = "Diablo";
$arr{"Bob"} = "Dylan";
print $arr{"Pax"} . "\n";
if (defined $arr{"no"}) {
print "Yes\n";
} else {
print "No\n";
}
Решение
Вы можете использовать переменные стебля, а не совсем как массивы, но очень похожие
/* REXX */
NAME = PAX
ARRAY.NAME = "DIABLO"
NAME = BOB
ARRAY.NAME = "DYLAN"
NAME = 'PAX'
SAY "ARRAY.PAX " IS ARRAY.NAME
NAME = 'BOB'
SAY "ARRAY.BOB " IS ARRAY.NAME
NAME = 'SANDY'
SAY "ARRAY.SANDY " IS ARRAY.NAME
IF ARRAY.NAME = "ARRAY.SANDY" THEN SAY "ARRAY.SANDY IS EMPTY"
Вышеуказанное Rexx будет печатать
ARRAY.PAX IS DIABLO
ARRAY.BOB IS DYLAN
ARRAY.SANDY IS ARRAY.SANDY
ARRAY.SANDY IS EMPTY
Они также могут быть соединение, как ABC, переменная стебля, если пустое вернется. Нет никакого способа потерять стебель, который не использует последовательные числа в качестве индекса, о котором я знаю.
IBM Manual со ссылкой на переменные стебля
Perl доступен в качестве дополнительной бесплатной функции для ZOS IBM портированные инструменты для z / OS
Другие советы
Я просто хочу добавить немного больше на ответ DEUIAN. Я согласен, переменные стебля Rexx являются ответом.
Простые переменные REXX по умолчанию к своему имени. Например:
/* REXX */
SAY 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
Переменные появляются после них. Некоторые люди находят это немного запутанным - подумайте об этом некоторое время, и это имеет большой смысл.
Версия Z/OS REXX не обеспечивает естественный способ итерации через переменную STEM. Самый простой способ сделать это - построить свой собственный индекс. Например:
/* 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.