I just discovered the following odd behavior with String#split :

"a\tb c\nd".split => ["a", "b", "c", "d"] "a\tb c\nd".split(' ') => ["a", "b", "c", "d"] "a\tb c\nd".split(/ /) => ["a\tb", "c\nd"]

The source (string.c from 2.0.0) is over 200 lines long and contains a passage like this:

/* L 5909 */ else if (rb_enc_asciicompat(enc2) == 1) { if (RSTRING_LEN(spat) == 1 && RSTRING_PTR(spat)[0] == ' '){ split_type = awk; } }

Later, in the code for the awk split type, the actual argument isn't even used any more and does the same as a plain split .

Does anyone else feel that this is somehow broken? Are there good reasons for this? Does “magic” like that happen more often than most people might think in Ruby?

It's consistent with Perl's split() behavior. Which in turn is based on Gnu awk 's split() . So it's a long-standing tradition with origins in Unix.

From the perldoc on split :

As another special case, split emulates the default behavior of the command line tool awk when the PATTERN is either omitted or a literal string composed of a single space character (such as ' ' or "\x20" , but not e.g. / / ). In this case, any leading whitespace in EXPR is removed before splitting occurs, and the PATTERN is instead treated as if it were /\s+/ ; in particular, this means that any contiguous whitespace (not just a single space character) is used as a separator. However, this special treatment can be avoided by specifying the pattern / / instead of the string " " , thereby allowing only a single space character to be a separator.

本文系统(linux)相关术语:linux系统 鸟哥的linux私房菜 linux命令大全 linux操作系统

本文标题:Why split ('') trying to be (also) s ...

技术大类 技术大类 | 系统(linux) | 评论(0) | 阅读(18)