¿Hay una manera de hacer las matrices asociativas en REXX?
-
28-09-2019 - |
Pregunta
Tengo algo de código Perl (para análisis de rendimiento) desarrolló por primera vez en Linux, que ahora tiene que ser portado a la unidad central. Al parecer REXX es el lenguaje de programación de elección en esa plataforma, pero este script Perl se basa principalmente en las matrices asociativas (básicamente matrices donde el índice es una cadena).
¿Hay una manera que en REXX? ¿Cómo lo haría código que algo como:
$arr{"Pax"} = "Diablo";
$arr{"Bob"} = "Dylan";
print $arr{"Pax"} . "\n";
if (defined $arr{"no"}) {
print "Yes\n";
} else {
print "No\n";
}
Solución
Puede utilizar madre variables, no exactamente como matrices, pero muy similar
/* 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"
Lo anterior Rexx imprimirá
ARRAY.PAX IS DIABLO
ARRAY.BOB IS DYLAN
ARRAY.SANDY IS ARRAY.SANDY
ARRAY.SANDY IS EMPTY
También puede ser compuesto como A.B.C Una variable madre si está vacío volverá en sí. No hay manera de iterar de un tallo que no utiliza números consecutivos como el índice, que yo sepa.
IBM manual con referencia a las variables del tallo
Perl está disponible como una característica adicional gratis para ZOS Herramientas de IBM con puerto para z / OS
Otros consejos
Sólo quiero añadir un poco más a la respuesta dada por Deuian. Estoy de acuerdo, las variables de REXX madre son la respuesta.
variables de REXX simples por defecto a su propio nombre. Por ejemplo:
/* REXX */
SAY X
imprimirá "X" hasta X
se le asigna otro valor:
/* REXX */
X = 'A'
SAY X
imprimirá "A".
No es gran sorpresa hasta ahora. las variables madre son un poco diferentes. los cabeza del vástago no se evalúa, solamente el bit después del punto inicial es.
Para ilustrar:
/* 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 */
Aviso X
la madre y el A
nombres no son evaluados, sin embargo, el
las variables X
y A
que aparecen después de ellos son. Algunas personas encuentran esto una
poco confuso - pensar en ello durante un tiempo y hace
gran sentido.
El z / OS versión de REXX no proporciona una forma natural para repetir una variable tallo. La forma más sencilla de hacerlo es construir su propio índice. Por ejemplo:
/* 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
Pretty trivial, pero ilustra la idea. Sólo asegúrese de que INDEX
(o lo que el nombre
elegir) para contener los nombres de indexación no hace estallar para arriba como un valor asociativo! Si esto es una posibilidad, utilizar alguna otra variable para contener el índice.
El último punto. Observe cada uno de mis ejemplos comienza con /* REXX */
se puede encontrar
que esto tiene que ser la primera línea de sus programas REXX en z / OS.