Beefy Boxes and Bandwidth Generously Provided by pair Networks
XP is just a number

List Splitter / Unmerge List

by CharlesClarkson (Curate)
on Feb 05, 2002 at 00:02 UTC ( #143322=snippet: print w/replies, xml ) Need Help??

This routine splits a list into more than one list.

my @arr = qw ( apples oranges bananas pears berries apricots ); my @arr_of_columns = split_list( \@arr, 2 );
giving us:
['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

    } else {
        my $padded = $qty - @$list_ref % $qty;
        push @{ $list_ref }, ($pad) x $padded;
        push @{ $return[$_ % $qty] }, $list_ref->[$_] for 0 .. $#$list
        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
    IIRC the conventional name for this is unmerge. At least that's what the RFC used. Also the use of split in the name is a bit confusing here as I would have expected such a thing to give:
    ([qw(apples oranges bananas)], [qw(pears berries apricots)]);
    I could also see zip and unzip being used (to highlight the interlacing).

    perl -pe "s/\b;([st])/'\1/mg"

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: snippet [id://143322]
[Corion]: The bots bow in response
[Discipulus]: so karlgoethebier, what this idiom is and where i can read about it? i tried to deparse and gives error..;=(
[karlgoethebier]: Eily: non-people == persone non grata?
[Your Mother]: Corion: I have lost the link to the pmdev guide(s). Do you have that handy?
[karlgoethebier]: Discipulus: see per lop please how to avoid the classic <c>perl 'rm -rfv *|'</>
[Eily]: karlgoethebier: more like grata non persona :P

How do I use this? | Other CB clients
Other Users?
Others exploiting the Monastery: (12)
As of 2017-07-21 08:10 GMT
Find Nodes?
    Voting Booth?
    I came, I saw, I ...

    Results (319 votes). Check out past polls.