splitの3つ目の引数の話

これは、Titterのタイムライン上に流れてきて、
それで知ったのですが、いろいろ勘違いしてたのでメモ。

こないだのHokkaido.pm Casual#17でやっと理解した訳ですが、
先に、ここを読めば良かったと後悔してる。
split – perldoc.jp

まずはこのコードから。

use strict;
use warnings;
use v5.10;

say "\n", '--- ', q[split /,/, 'a,b,c'], ' ---';
say 'n = ', scalar( split /,/, 'a,b,c' );
say qq/"$_"/ for split /,/, 'a,b,c';

say "\n", '--- ', q[split /,/, 'a,b,c', 1], ' ---';
say 'n = ', scalar( split /,/, 'a,b,c', 1 );
say qq/"$_"/ for split /,/, 'a,b,c', 1;

say "\n", '--- ', q[split /,/, 'a,b,c', 2], ' ---';
say 'n = ', scalar( split /,/, 'a,b,c', 2 );
say qq/"$_"/ for split /,/, 'a,b,c', 2;

say "\n", '--- ', q[split /,/, 'a,b,c', 0], ' ---';
say 'n = ', scalar( split /,/, 'a,b,c', 0 );
say qq/"$_"/ for split /,/, 'a,b,c', 0;

実行結果はこんな感じ。
$ perl aaa.pl

--- split /,/, 'a,b,c' ---
n = 3
"a"
"b"
"c"

--- split /,/, 'a,b,c', 1 ---
n = 1
"a,b,c"

--- split /,/, 'a,b,c', 2 ---
n = 2
"a"
"b,c"

--- split /,/, 'a,b,c', 0 ---
n = 3
"a"
"b"
"c"

で、見ての通り、3つ目の引数は、
何個まで分割するかを指定するのに使う。

じゃぁ、次の場合は?

use strict;
use warnings;
use v5.10;

say "\n", '--- ', q[split /,/, ',,'], ' ---';
say 'n = ', scalar( split /,/, ',,' );
say qq/"$_"/ for split /,/, ',,';

say "\n", '--- ', q[split /,/, ',,', -1], ' ---';
say 'n = ', scalar( split /,/, ',,', -1 );
say qq/"$_"/ for split /,/, ',,', -1;

say "\n---";
my @tmp = split /,/, ',,', -1;
say ( not $tmp[0] );

実行結果はこんな感じ。
$ perl bbb.pl

--- split /,/, ',,' ---
n = 0

--- split /,/, ',,', -1 ---
n = 3
""
""
""

---
1

分割した結果、空のフィールド(文字数が0のところ)は取り除かれる。
でも、3つ目の引数に-1を指定するとundefが入る。
なので、その要素を参照しようとすると、未初期化だって怒られるので、
最後の行の要領で、undefであることを確認した。

てっきり、何文字以上は分割するとかだと思ったら勘違いだった。
あと、qw/.../に半角スペースだけの文字列を入れた場合に、
要素数が0個なのは、これと同じことが起きていると思っていんですかね。

P.S.
split – perldoc.jpに、「空フィル土」が見つかったんだけど、
YAPC::Asia Tokyo 2013で誰かに相談しますね。

おしまい。

Leave a Comment