7

我有一些最初在 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";
}
4

2 回答 2

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

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

参考 Stem 变量的 IBM 手册

Perl 作为 ZOS IBM Ported Tools for z/OS的额外免费功能提供

于 2010-11-04T14:48:05.490 回答
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词干名称没有被计算,但是, 出现在它们之后的X和变量是。A有些人觉得这有点令人困惑——想一想,这很有意义。

Z/OS 版本的 REXX 不提供迭代干变量的自然方式。最简单的方法是建立自己的索引。例如:

/* 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 程序的第一行开头。

于 2010-11-04T20:00:41.640 回答