風邪が全然抜けない…リハビリしなきゃ…
鉈でひげ剃り感があるのは、こうも書けるからかな。
use 5.012; sub fizzbuzz { my @fizzbuzz; push @fizzbuzz, ('Fizz')[$_%3] . ('Buzz')[$_%5] || $_ for @_; @fizzbuzz; }; my @hundred = (1..100); while (my @fifteen = splice @hundred, 0, 15) { say join ", ", fizzbuzz @fifteen; }
なにそれ?
splice
というのは一体何をする関数なのかというと、配列からサブ配列を取り出して、さらに引数に配列があれば、空いた隙間にその配列を挿入するという関数。
つまり、全ての配列操作は、splice
に還元することが出来ます。
The following equivalences hold (assuming "$#a >= $i" ) push(@a,$x,$y) splice(@a,@a,0,$x,$y) pop(@a) splice(@a,-1) shift(@a) splice(@a,0,1) unshift(@a,$x,$y) splice(@a,0,0,$x,$y) $a[$i] = $y splice(@a,$i,1,$y)
Perlのみならず、JavaScriptにも存在します。
JavaScript
余談
残念ながら Ruby や Python にはsplice
に相当する組み込み(関数|メソッド)が存在しないようなのですが、その代わり ruby には Enumerable#each_slice
なんて素敵メソッドがあったりします。
1.upto(100).each_slice(15) do |s| p s end
まとめ
万能すぎて単能の push
, push
, shift
, unshift
ほどには使われない splice
ですが、上記のように「配列を一要素ずつではなく数要素づつまとめて処理する」場合など、どんびしゃりな用法も結構あるので覚えておくとちょっぴり幸せになれるかも。
Dan the Splicer
このブログにコメントするにはログインが必要です。
さんログアウト
この記事には許可ユーザしかコメントができません。