in reply to A maybe(?) interesting comp-sci type problem

Here something which would flatten your array completely; putting it into a "matrix" with 5 columns is left as an exercise.

Warning: Code not tested.

# Call as: flatten([...]) sub flatten { my $aref=shift; die "not an array ref" unless ref($aref) eq 'ARRAY'; @result=(); foreach my $element (@$aref) { push @result, (ref($element) eq 'ARRAY' ? flatten($element) : $element); } @result; }
-- 
Ronald Fischer <ynnor@mm.st>

Replies are listed 'Best First'.
Re^2: A maybe(?) interesting comp-sci type problem
by tachyon-II (Chaplain) on May 06, 2008 at 11:04 UTC

    Besides the fact that this does not work (it will if you localise @result with my)..... As they say, any recursive solution can be written as in iterative one. Taking advantage of the fact you can push onto a list you are iterating over:

    sub flatten_recursive { my $tree = shift; my @result; for my $node (@$tree) { push @result, ref $node ? flatten_recursive($node) : $node; } @result; } print join ' ', flatten_recursive($data_struct), "\n"; sub flatten_iterative { my @tree = ($_[0]); my @results; for my $node (@tree) { (ref $node) ? push @tree, @$node : push @results, $node; } return \@results; } print join ' ', @{flatten_iterative($data_struct)}, "\n";
Re^2: A maybe(?) interesting comp-sci type problem
by ikegami (Patriarch) on May 06, 2008 at 08:42 UTC

    You're assuming that all leaves must be at the same, known depth (5).

    If that's a valid assumption, natatime from List::MoreUtils can do the "matrification".