split関数 見つからなかった時の返り値No.09959
styth さん 22/10/11 08:38
 
 ヘルプを拝見すると、
>split関数は、文字列から指定した文字列をすべて検索し、見つかった文字列を取り
>除いて分割し、配列に格納します。(V8.89以降)
>返り値(数値型)
>分割された数(区切られた数)を返します。
 とのことなのですが、色々やってみたら、見つからなかった時は、返り値に1が返
ります。
 直観的には、返り値は分割された数(見つからないので分割できていない)なので、
0かと思っていました。
 なので、ヘルプに「見つからなかった時は、返り値=1」ということを追記して頂
けないでしょうか。
 よろしくお願いいたします。

 返り値は、分割された数ということなので、以下のマクロで、$strを変えて、確認
しました。

$str = "abc#def#xyz";
#nLength = split( $aRet, $str, "#" );
message str(#nLength) + "\n"
 + $aRet[0] + "\n"
 + $aRet[1] + "\n"
 + $aRet[2] + "\n"
 ;
endmacro;

$str = "abc#def#xyz";
 返り値は3なので、
 3個に分割された→abc def xyz($aRet[0]〜 [2] )

$str = "abc#def";
 返り値は2なので、
 2個に分割された→abc def
 ここまでは、感覚的に、一応こう思えるんですが、

$str = "abc#";
 返り値は2なので、
 2個に分割されたが、→abcだけ

$str = "abc";
 返り値は1なので、
 1個に分割された→abcがある?(分割できないはずなのに)

 となり、返り値と分割数が異なり、感覚的に違和感を感じます。

[ ]
RE:09959 split関数 見つからなかった時No.09960
でるもんたいいじま さん 22/10/11 14:19
 
秀丸愛用者の「でるもんた・いいじま」です。

>  ヘルプを拝見すると、
> >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;

[ ]
RE:09960 split関数 見つからなかった時No.09961
styth さん 22/10/12 09:03
 
>これは1で正解だと思います。
>「返り値=(見つかったセパレーターの数+1)」という等式が成立します。
 こういう記述がヘルプにされていれば、それでも構いません。

>秀丸マクロには「長さ0の文字列 ""」と「文字列が存在しない(C言語のヌルポイン
>タやJavaSctiptのnullなど)」との区別がない、サイズ可変の配列も存在しない、
>ということが話を分かりにくくしているのだと思います。
 分かりました。

>JavaScriptかPerlか何かの経験があれば、今の仕様を不自然とは思わないのですが…。
 未経験でした。すみません。

 いずれにしても、お願いとしては、
>なので、ヘルプに「見つからなかった時は、返り値=1」ということを追記して頂
>けないでしょうか。
 ということです。

 (いつも、splitを使うときに、混乱していますので。)

[ ]
RE:09961 split関数 見つからなかった時No.09962
秀丸担当 さん 22/10/12 09:56
 
見つからなかったときは1と書いておきます。
分割された数というとわかりにくかったかもしれません。
配列の要素数と考えるとわかりやすいと思います。

[ ]