8

重複の可能性:
Ruby の分割問題

Ruby では、文字列の先頭に一致する区切り文字で文字列を分割すると、配列の最初の位置に空の文字列が返されます。

"abc".split(/a/) # => ["", "bc"]

しかし、文字列の末尾に一致する区切り文字で同様のことを行うと、空の文字列が得られません:

"abc".split(/c/) # => ["ab"]

これは私には矛盾しているように見えます。そのような仕様の根拠はありますか?

編集 Muu のように Perl の仕様と互換性がある場合、質問は同じままです: Perl ではなぜそうなのか? このため、現在は Perl に関する質問にもなっています。

4

2 に答える 2

9

細かいマニュアルから:

split(pattern=$;, [limit]) → anArray
[...] limit
パラメータを省略 した場合、末尾の null フィールドは抑制されます。limitが正の数の場合、最大でその数のフィールドが返されます ( limitが 1 の場合、文字列全体が配列内の唯一のエントリとして返されます)。負の場合、返されるフィールドの数に制限はなく、末尾の null フィールドは抑制されません。

したがって、末尾の「null フィールド」は抑制されています。これは、ドキュメントに記載されているためです。末尾の空の文字列が必要な場合は、次のように求めます。

'abc'.split(/c/, -1) # [ 'ab', '' ]

なぜそのように振る舞うのでしょうか?おそらく、Perl のsplit動作と一致するためです。

が負の場合LIMIT、代わりに任意に大きいかのように扱われます。可能な限り多くのフィールドが生成されます。

また、負の値を使用するとlimit、末尾に空の文字列が返されることがわかります。

$ perl -e 'print join(",", split(/c/, "abc")), "\n"'
ab
$ perl -e 'print join(",", split(/c/, "abc", -1)), "\n"'
ab,

なぜ Perl の動作をコピーするのですか? マッツに聞いてください。

于 2012-11-07T16:37:19.390 に答える
4

muに続くAWKの仕様を読んだ後、AWKの本来の目的は、フィールドに対応するサブストリングを抽出することであり、各サブストリングは、、splitのような句読点で終了し、セパレーターは「フィールド文字の終わり」。意図は、ストリングを各セパレーター位置の左側と右側に対称的に分割することではなく、セパレーター位置の左側でサブストリングを終了することでした。この概念では、セパレーターの左側に(空の場合でも)常に文字列を含めることは理にかなっていますが、必ずしもセパレーターの右側にあるとは限りません。これは、Perlを介してRubyに継承された可能性があります。,.

于 2012-11-07T20:13:06.190 に答える