【问题标题】:Is there a way to do associative arrays in REXX?有没有办法在 REXX 中做关联数组?
【发布时间】:2011-05-05 01:07:39
【问题描述】:

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

【问题讨论】:

  • +1 表示 REXX 问题。自从我的 OS/2 天以来就没有想过 REXX。

标签: associative-array mainframe zos rexx


【解决方案1】:

你可以使用stem变量,不完全像数组,但非常相似

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

【讨论】:

    【解决方案2】:

    我只是想对 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 出现在它们之后的变量是。有些人发现这是一个 有点混乱 - 想一想,它会让 很有道理。

    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 程序的第一行。

    【讨论】:

    • 除上述之外,还可以通过 Symbol() 函数查看是否设置了变量: X=1; Say Symbol('X') /* -> 'VAR' /;说 Symbol('Y') / -> 'LIT' (for 'literal') */
    • 我注意到所有的例子都是大写的。 Rexx 是区分大小写的。您必须记住的一点是,未初始化的变量使用它们的大写名称作为它们的值。因此 x.a = 1 实际上将 x.A 设置为 1。但是,如果 c='a' 则 x.c 将 x.a 设置为与 x.A 完全分离的茎叶。
    • @Wes 复合符号的求值工作如下: 1) 词干名称折叠为大写但不求值。 2)尾元素(由点分隔)折叠为大写,然后评估为单个符号。 3) 折叠的词干名称加上评估的尾符号形成一个“新”符号。 4) 按原样评估“新”符号(未折叠)。该评估产生复合符号值。继续您的示例,其中 c = 'a' 且符号 a 未分配,复合符号:xc、xC、Xc 和 XC 的计算结果相同,同样,xa、xA、Xa 和 XA 的计算结果也相同,但是不同的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2012-01-12
    • 2016-02-08
    相关资源
    最近更新 更多