Есть ли способ сделать ассоциативные массивы в REXX? - PullRequest
6 голосов
/ 04 ноября 2010

У меня есть некоторый код 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";
}

Ответы [ 2 ]

13 голосов
/ 04 ноября 2010

Вы можете использовать переменные ствола, не совсем как массивы, но очень похожие

/* 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 со ссылкой на переменные основы

Perlдоступна в качестве дополнительной бесплатной функции для ZOS IBM Ported Tools для z / OS

11 голосов
/ 04 ноября 2010

Я просто хочу добавить еще немного к ответу Дэуяна.Я согласен, что переменные 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.

...