N件ごとに取り出すイタレータ
もっと防御てきにしたほうがいいはず。
~/perl $ perl -MData::Dumper -MTupleIterator -e ' $a=+[qw/a b c d e f g h/]; $b=TupleIterator::get_tuple_iterator($a,3); while($b->("more")){print Dumper($b->("next"))}; print Dumper($b->("remain")) ' $VAR1 = [ 'a', 'b', 'c' ]; $VAR1 = [ 'd', 'e', 'f' ]; $VAR1 = [ [ 'g', 'h' ] ];
package TupleIterator; use strict; use warnings; sub get_tuple_iterator { my ($list, $num) = @_; return sub { my $action = shift ; if( $action eq 'more'){ return scalar(@$list)>=$num ? 1 : undef; } if( $action eq 'next'){ return +[splice @$list, 0, $num]; } if( $action eq 'remain'){ return scalar(@$list)<$num ? [$list] : undef ; } }; } 1;