有没有办法在REXX中做关联数组?

时间:2010-11-04 12:40:03

标签: associative-array mainframe zos rexx

我有一些首先在Linux下开发的Perl代码(用于性能分析),现在需要移植到大型机。显然,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 个答案:

答案 0 :(得分:13)

你可以使用干变量,不像数组那样但非常相似

/* 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

它们也可以像a.b.c那样复合 如果为空,则干变量将自行返回。 没有办法迭代不使用连续数字的词干作为我所知道的索引。

IBM Manual with reference to Stem variables

Perl作为ZOS IBM Ported Tools for z/OS

的额外免费功能提供

答案 1 :(得分:11)

我只是想对Deuian给出的答案补充一点。 我同意,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 */                                   

请注意,XA词干名称未被评估,但是, 其后出现的XA变量是。有些人发现这个 有点令人困惑 - 想一想它就可以了 很有意义。

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 */开头 这需要是Z / OS下REXX程序的第一行。