REXX のコーディングに関するヒント
REXX によるあいまいな比較ではなく、ストリングの 精密な比較
を行います。
REXX は、等価テストの =
の使用と ==
の使用を厳密に区別します。(同様のことが、< と <<、およびその他の演算子にも言えますが、最も重要な問題は等価テストです。)
==
を使用すると、REXX は引数をストリングとして扱い、変更なしに引数の比較をします。ただし、=
を使用すると、REXX は比較を行う前に引数を変換しようとします。REXX は、最初に両方の引数を数値に変換しようとします。これが失敗すると、引数をストリングとして扱い、先行ブランクおよび末尾ブランクを除去してから、結果のストリングの長さが等しくない場合、短いほうのストリングの右側をブランクで埋め込みます。
File Manager REXX プログラミングの経験則では、すべてのストリング比較では==
を使用して、数値比較では =
を注意して使用することをお勧めします。
精密な等価演算子 (
==) を使用する場合、必要に応じてリテラルをブランクで埋め込む必要があります。例えば、各レコードの最初の 10 バイトに大文字の名前と末尾ブランクが含まれている場合、次のステートメントの結果は真です。
FLD(1,10) = 'FRED'
しかし、次のステートメントは偽です。FLD(1,10) == 'FRED'
2 番目の例で示されるような問題を避けるために (かつ、あいまいな
=ではなく推奨される
==の使用を維持)、以下の代替手段のいずれかをコーディングします。
STRIP(FLD(1,10)) == 'FRED'
FLD(1,10) == 'FRED '
(末尾ブランク 6 個)
結論としては、FASTREXX 処理が実行でき、STRIP 機能を使用するとできないため、後者の選択が最適です。
以下に、予期せず起こる可能性がある結果の例をいくつか挙げます。
REXX | 結果 |
---|---|
IF 'A ' = ' A' |
真 |
IF 'C140'x = '40C1'x |
真 |
IF 'A ' == ' A' |
False |
IF '01' = '1 ' |
True |
IF '001' = '1E0' |
真 (1E0 は浮動小数) |
IF '+ 1.00' = ' 1E0' |
真 |
IF '12345678901' = 12345678902 |
真 (整数の場合はデフォルトの REXX 数値精度より長い) |