†REXXのどろぬま†
作成開始日 2014.10.25
最終更新日 2014.10.30
IF 0E320060 = 0E704641 THEN … IF 0E320060 = 00E15353 THEN …などは《真》となってしまう。原因は、REXXがこれらの文字列を指数形式(ENGINEERING)の《数値》と看做してしまうため。「E」に先行する数字がすべて「0」であれば、指数部の値に拘らず、数値としては0になる。つまり、上記の例は、共に「IF 0 = 0 THEN…」として処理されているわけだ。もちろん、これらの値を変数に入れて比較しても、まったく同じ現象が起きる。と言うより、上記模擬コードのように直に比較することは、現実にはありえない。
では、数値と看做されなけば良いのだから、
IF "0E320060" = "0E704641" THEN …のように文字列であることを明示すれば良いのかと言うと、残念ながらこれもダメ。REXXは中味を自動的に判別して、勝手に数値に変換した上で比較を実行する。このIF文もやはり《真》となってしまう。型概念のないREXXの仕様上の欠点と言ってよいだろう。
このような現象が起きる条件は;
@文字列が「数字E数字」形式であること。「E」以外の文字や記号が含まれていると、自動的な数値化はされない。また、「E」が2回以上含まれている場合も数値化されない。
A「E」に先行する数字が「0」のみからなっていること。他の数字が含まれていると、たとえ数値化されても値が0にはならないので、特別な場合を除いてイコールにはならない。たとえば、「1E2」と「10E1」はともに100を意味するのでイコールになってしまうが、こうした偶然は滅多に起きないだろう。
したがって、この問題に対処するには、文字列の先頭や末尾に適当な記号や英字をくっつければ良い。例えば;
IF "$0E320060" = "$0E704641" THEN … IF "0E320060X" = "0E704641X" THEN …ならば、きちんと《偽》になる。つまり、16進文字列は;
CALL LINEIN inp, hex_st hex_st='$'hex_stのように下処理をした上で使用することが必要。