†REXXのどろぬま†

スペースとブランクの区別不可能

作成開始日 2021.12.11
最終更新日 2021.12.11

REXXの変数には型という概念がない。それが便利なことも多々あるのだが、とんでもないミスを誘発する原因にもなる。たとえば、次のようなIF文はどうなるか?
/* Sample1.cmd : space or blank */

st=' '	/* 半角スペース */
IF st='' THEN SAY 'BLANK'	/* ブランクと判断 */
IF st=' ' THEN SAY 'SPACE'	/* スペースと判断 */
変数に半角スペースを代入して、IF文で判断させているだけなので、他の言語ならば何の問題もなく「SPACE」と表示される。ところが、REXXでは;
C:\WORK>sample1[Enter]
BLANK
SPACE
と言うとんでもない結果になる。半角スペースは、半角スペースともブランク(空白文字列)とも判断されてしまう。どちらも「真」である。これは複数個の半角スペースでも同じで;
/* Sample2.cmd : space or blank */

st='   '	/* 半角スペース3個 */
IF st=''     THEN say 'BLANK'
IF st=' '    THEN say 'SPACE'
IF st='  '   THEN say 'SPACE x2'
IF st='   '  THEN say 'SPACE x3'
IF st='    ' THEN say 'SPACE x4'
say '*'st'*'
を実行すると、これまた驚くべきことに;
C:\WORK>sample2[Enter]
BLANK
SPACE
SPACE x2
SPACE x3
SPACE x4
*   *
という結果になる。スペースの数が違っていても何の問題もなく「真」と見なす。スペース3個はスペース4個とも同じなのである。もちろん、stの中身が改変されるわけではなく、IF文の後にstを参照すれば、きちんとスペース3個のままになっている。

恐らく、IF文実行時には文字列が数値に変換され、変換不可能な文字列のみが純粋な文字列として比較されるのだろう。つまり、ブランクもスペース(複数個でも)も、数値「0」に変換され、実質的には「IF 0=0 THEN …」を実行しているのと同じになる。これは、16進数の誤認識の問題と本質的には同じである。

原理が判れば、何となくそんなもんかと言う気分にもなるが、スペースを含む文字列をIF文で操作するときは、相当に慎重にしないとドツボにはまりそうだ。


【REXXのどろぬま目次】 【ホーム】