Rexx - использование квадратных скобок

Я совсем новичок в Rexx, здесь очень простые вещи, я хочу быстро получить последний элемент массива.

Откройте Object Rexx 4.2.0 для Windows:

test.0=2
test.1="foo"
test.2="bar"
say test.[test.0]

==> Вывести как хотел:

bar

Я легко догадываюсь, что интерпретатор Open Object Rexx работает. Квадратные скобки нельзя использовать с Rexx в z/OS.

Первое, что пришло мне в голову (не RTFM):

say test.test.0
say test.(test.0)

==> Вывод не очень хороший:

TEST.TEST.0
    5 *-* say test.(test.0)
Error 16 running Test.REX line 5:  Label not found
Error 16.1:  Label "SYNTAX" not found

Есть ли другие варианты использования квадратных скобок? Почему из C/Java/Python я иду на test.test.0 или test.(Test.0), как на пустышку?

Не могу найти больше информации об использовании квадратных скобок в Rexx, чем это: # хвостовое выражение Реджинальда

Так что под z / OS сейчас я застрял с:

temp=test.0
say test.temp

4 ответа

Решение

Вы уже нашли ответ на свой вопрос.

Единственный способ использования мэйнфреймов REXX (z/OS, z/VSE, z/VM), как вы написали выше:

temp=test.0
say test.temp

Лучшая документация для понимания того, что делает интерпретатор REXX, может быть найдена в Справочнике по REXX z / OS TSO / E в разделе Составные символы (ссылка V2.1). Он описывает, почему test.test.0 не будет работать из-за того, как интерпретатор обрабатывает строку; в этом случае он ищет стебель test.test.0.

Обратите внимание, что вы могли бы код

test.test.0 = 0

и у вас будет действительный стебель test.test.0 (хотя, вероятно, в большинстве случаев он бесполезен).

Следующая тема в ссылке обсуждает переменные ствола, которые также содержат много полезной информации.

Я настоятельно рекомендую прочитать как Справочник z/OS TSO/E REXX, так и Руководство пользователя z/OS TSO/E REXX (обе ссылки V2.1).


Другие чистые (необъектные) альтернативы Rexx:

interpret "say test." || test.0

или же

say value("test." || test.0)

Помните, что (по крайней мере, в z/OS) переменная.0 не обновляется автоматически. Например:

list.1 = 17
list.2 = 12
say 'List.0 is' list.0

Даст LIST.0, который является значением по умолчанию (имя переменной) для инициализированной переменной.

Интерпретатор Rexx по умолчанию в z/OS - это классический Rexx, а не OORexx. OORexx не был перенесен в z/OS.

Другие вопросы по тегам