Есть ли способ сделать ассоциативные массивы в Rexx?

StackOverflow https://stackoverflow.com/questions/4096716

Вопрос

У меня есть какой-то код 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top