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