|
秀丸愛用者の「でるもんた・いいじま」です。
> ヘルプを拝見すると、
> >split関数は、文字列から指定した文字列をすべて検索し、
> >見つかった文字列を取り除いて分割し、配列に格納します。(V8.89以降)
> >返り値(数値型)
> >分割された数(区切られた数)を返します。
> とのことなのですが、色々やってみたら、
> 見つからなかった時は、返り値に1が返ります。
> 直観的には、返り値は分割された数(見つからないので
> 分割できていない)なので、0かと思っていました。
これは1で正解だと思います。
「返り値=(見つかったセパレーターの数+1)」という等式が成立します。
> $str = "abc#def#xyz";
> #nLength = split( $aRet, $str, "#" );
> message str(#nLength) + "\n"
> + $aRet[0] + "\n"
> + $aRet[1] + "\n"
> + $aRet[2] + "\n"
> ;
> endmacro;
> $str = "abc#";
> 返り値は2なので、
> 2個に分割されたが、→abcだけ
これは $aRet[1] に "" がしっかり代入されている、と解釈すれば筋が通ります。
ここでたとえば、
$str = "abc##xyz";
で試してみると、
$aRet[0] == "abc"
$aRet[1] == ""
$aRet[2] == "xyz"
という結果が返ってきます。
秀丸マクロには「長さ0の文字列 ""」と「文字列が存在しない(C言語のヌルポイン
タやJavaSctiptのnullなど)」との区別がない、サイズ可変の配列も存在しない、と
いうことが話を分かりにくくしているのだと思います。
JavaScriptかPerlか何かの経験があれば、今の仕様を不自然とは思わないのですが…。
> $str = "abc";
> 返り値は1なので、
> 1個に分割された→abcがある?(分割できないはずなのに)
この場合でも、きちんと $aRet[0]には "abc" が入っています。
ちなみに、$aRet[] の #nResult 番目以降の要素は綺麗さっぱり抹消されるようです。
以下、私が試したサンプルコードです。$src をいろいろ変えて試してみて下さい。
$src = "abc##xyz";
$ret[0] = "--0th--";
$ret[1] = "--1st--";
$ret[2] = "--2nd--";
$ret[3] = "--3rd--";
$ret[4] = "--4th--";
#nResult = split( $ret, $src, "#" );
message sprintf("#nResult=%d\n$ret[]=('%s','%s','%s','%s','%s')\n",
#nResult, $ret[0], $ret[1], $ret[2], $ret[3], $ret[4]
);
endmacro;
|
|