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

Xと語幹A名は評価されませんが、 その後にある変数と は評価されます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 プログラムの最初の行である必要があることに気付くかもしれません。

于 2010-11-04T20:00:41.640 に答える