fixedpoint.jp


`split' splits langs (2007-08-30)

きっかけ: 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>

この振る舞いが奇妙に思えたので、他の言語での対応する関数を調べてみました。

awk
split(string, array [, fieldsep])
(ソースから推測すると Ruby での振る舞いはおそらくこれに由来している。)
JavaScript
String.prototype.split(separator, limit)
Perl
split /PATTERN/,EXPR,LIMIT
Python
split([sep [,maxsplit]])
PHP
split
explode
preg_split
C
split と同様の機能を提供する関数として strsep などがある。ただし delimiter に正規表現は使えない。
Java
String#split(String regex, int limit)
Haskell
split に相当する関数はない。
Smalltalk
split に相当する関数はない。
Common Lisp
split に相当する関数はない。
Emacs Lisp
(split-string STRING &optional SEPARATORS)
Scheme
現在の標準 R5RS、SRFI 13、および次の標準になる予定の R5.97RS には split に相当する手続きはない。Gauche には独自の手続き string-split がある。

それぞれで空文字列を分割したときの振る舞いは:

awk
gawk では空配列を返すとドキュメンテーションされている: The GNU Awk User's Guide - 8.1.3 String-Manipulation Functions
ECMAScipt(JavaScript)
ECMAScript 262: separator が空文字列にマッチする場合には空配列を返し、さもなければ1つの空文字列のみからなる配列を返す。
Perl
split は空配列を返すとドキュメンテーションされている: split - perldoc.perl.org
Python
split は1つの空文字列のみからなる配列を返すとドキュメンテーションされている: Python Library Reference - 3.6.1 String Methods
PHP
split(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) ""
}
C
(省略)
Java
String (Java 2 Platform SE v1.4.2) - split の記述を参照すると、limit に依存して空配列もしくは1つの空文字列のみからなる配列を返す(ようだ)。
Emacs Lisp
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
Scheme
Gauche の 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>

参考


© 2006-2023 fixedpoint.jp