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 );
|
|---|