Rexxで連想配列を行う方法はありますか?
-
28-09-2019 - |
質問
Perlコード(パフォーマンス分析用)がいくつかあります。最初にLinuxの下で開発されたもので、メインフレームに移植する必要があります。どうやらRexxはそのプラットフォームで選択したスクリプト言語ですが、このPerlスクリプトは連想配列(基本的にインデックスが文字列であるアレイ)に大きく依存しています。
Rexxには方法がありますか?次のようなものをコーディングするにはどうすればよいですか:
$arr{"Pax"} = "Diablo";
$arr{"Bob"} = "Dylan";
print $arr{"Pax"} . "\n";
if (defined $arr{"no"}) {
print "Yes\n";
} else {
print "No\n";
}
解決
アレイとはまったく異なり、非常に似ているステム変数を使用できます
/* 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のような化合物にすることもできます。私が知っているインデックスとして連続した数値を使用しないステムを反復する方法はありません。
PerlはZosの追加の無料機能として利用できます IBMはZ/OSのツールを移植しました
他のヒント
Deuianが与えた答えにもう少し追加したいだけです。 Rexx STEM変数が答えです。
単純な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
ただし、STEM名は評価されませんX
と A
それらの後に表示される変数はそうです。一部の人々はこれが少し混乱していると感じています - しばらく考えてみてください。それは非常に理にかなっています。
RexxのZ/OSバージョンは、STEM変数を繰り返す自然な方法を提供しません。これを行う最も簡単な方法は、独自のインデックスを構築することです。例えば:
/* 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プログラムの最初の行である必要があることがわかります。