きっかけ: Ruby 1.8 では String クラスのメソッド split
を空文字列に渡すと必ず空配列が返ります:
$ ruby --version
ruby 1.8.2 (2005-04-11) [i386-linux]
$ irb
irb(main):001:0> "".split("x")
=> []
irb(main):002:0> "".split(//)
=> []
irb(main):003:0>
この振る舞いが奇妙に思えたので、他の言語での対応する関数を調べてみました。
split(string, array [, fieldsep])
String.prototype.split(separator, limit)
split /PATTERN/,EXPR,LIMIT
split([sep [,maxsplit]])
split
explode
preg_split
split
と同様の機能を提供する関数として strsep
などがある。ただし delimiter に正規表現は使えない。String#split(String regex, int limit)
split
に相当する関数はない。split
に相当する関数はない。split
に相当する関数はない。(split-string STRING &optional SEPARATORS)
split
に相当する手続きはない。Gauche には独自の手続き string-split
がある。それぞれで空文字列を分割したときの振る舞いは:
split
は空配列を返すとドキュメンテーションされている: split - perldoc.perl.orgsplit
は1つの空文字列のみからなる配列を返すとドキュメンテーションされている: Python Library Reference - 3.6.1 String Methodssplit
は(limit が 0 でも)1つの空文字列のみからなる配列を返す。explode
は delimiter が空文字列にマッチする場合には警告し false を返す。さもなくば1つの空文字列のみからなる配列を返す。preg_split
は2つの空文字列からなる配列を返す場合がある:$ php --version
PHP 4.3.10-22 (cli) (built: Jun 30 2007 14:42:16)
Copyright (c) 1997-2004 The PHP Group
Zend Engine v1.3.0, Copyright (c) 1998-2004 Zend Technologies
$ php -r '$x=preg_split("//", "");var_dump($x);'
array(2) {
[0]=>
string(0) ""
[1]=>
string(0) ""
}
split-string
は空リストを返す:(emacs-version)
=> "GNU Emacs 21.4.1 (i386-pc-linux-gnu)
of 2005-03-18 on trouble, modified by Debian"
(split-string "" "")
=> nil
string-split
は splitter が空文字列にマッチする場合にはエラーとなり、さもなければ1つの空文字列のみからなるリストを返す:gosh> (gauche-version)
"0.8.10"
gosh> (string-split "" "")
*** ERROR: string-split: splitter must not match a null string: ""
Stack Trace:
_______________________________________
0 (error "string-split: splitter must not match a null string:" spli ...
At line 57 of "/usr/local/share/gauche/0.8.10/lib/gauche/stringutil.scm"
1 (%string-split-scanner splitter)
At line 50 of "/usr/local/share/gauche/0.8.10/lib/gauche/stringutil.scm"
gosh> (string-split "" #/x/)
("")
gosh>
参考