風邪が全然抜けない…リハビリしなきゃ…

鉈でひげ剃り感があるのは、こうも書けるからかな。

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に還元することが出来ます。

splice - perldoc.perl.org
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