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 );
In reply to Re: Group array in threes
by johngg
in thread Group array in threes
by joec_
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |