in reply to Group array in threes

Another way using an on-the-fly subroutine which leaves the array untouched.

use strict; use warnings; my @arr = qw{ 1 1 0 2 0 1 3 0 0 4 1 1 }; sub { local $" = q{,}; print qq{@{ [ map shift, 1 .. 3 ] }\n} while @_; }->( @arr ); print qq{@arr\n};

The output.

1,1,0 2,0,1 3,0,0 4,1,1 1 1 0 2 0 1 3 0 0 4 1 1

If the array has an element count that is not a multiple of three then add a grep to avoid "Use of uninitialized value in join or string..." warnings.

use strict; use warnings; my @arr = qw{ 1 1 0 2 0 1 3 0 0 4 1 1 5 7 }; sub { local $" = q{,}; print qq{@{ [ grep defined, map shift, 1 .. 3 ] }\n} while @_; }->( @arr ); print qq{@arr\n};
1,1,0 2,0,1 3,0,0 4,1,1 5,7 1 1 0 2 0 1 3 0 0 4 1 1 5 7

I hope this is of interest.

Cheers,

JohnGG

Update: Fixed broken para tag.

Also, looking at moritz's reply, I don't know why it never occurs to me to modify output field and record separators instead of list separator. Doing so makes things much cleaner.

use strict; use warnings; my @arr = qw{ 1 1 0 2 0 1 3 0 0 4 1 1 5 7 }; sub { local( $,, $\ ) = ( q{,}, qq{\n} ); print grep defined, map shift, 1 .. 3 while @_; }->( @arr );