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