This routine splits a list into more than one list.
giving us:my @arr = qw ( apples oranges bananas pears berries apricots ); my @arr_of_columns = split_list( \@arr, 2 );
['apples', 'bananas','berries', 'prunes'] ['oranges','pears', 'apricots']
If you want to pad the end of uneven arrays place the padding as the third argument
my $arr_of_arr = split_list( [ 1 .. 7 ], 3, undef ); which gives:[1,4,7] [2,5,undef] [3,6,undef]
A note of caution: The original array is left intact. If split_list is used on large arrays you could run out of memory before this task completes.
Update:Changed title to mention unmerge. Thanks, belg4mit
sub split_list { use integer; my ( $list_ref, $qty, $pad ) = @_; return unless ref $list_ref eq 'ARRAY'; my @return; if ( !( @$list_ref % $qty ) || @_ == 2 ) { push @{ $return[$_ % $qty] }, $list_ref->[$_] for 0 .. $#$list +_ref; } else { my $padded = $qty - @$list_ref % $qty; push @{ $list_ref }, ($pad) x $padded; push @{ $return[$_ % $qty] }, $list_ref->[$_] for 0 .. $#$list +_ref; pop @$list_ref for 1 .. $padded; } return @return if wantarray; return \@return; }
|
---|
Replies are listed 'Best First'. | |
---|---|
Re: List Splitter
by belg4mit (Prior) on Feb 05, 2002 at 00:10 UTC |
Back to
Cool Uses for Perl