sub flatten { my ($tree) = @_; my @results; for (my $i=0; $i<@$tree; ) { my $has_subtree = ref($tree->[$i+1]); if ($has_subtree) { my $term = $tree->[$i+0]; my $subtree = $tree->[$i+1]; push @results, map { [ $term, @$_ ] } @{ flatten($subtree) }; $i += 2; } else { my $term = $tree->[$i+0]; push @results, [ $term ]; $i += 1; } } return \@results; } print("@$_\n") for @{ flatten($data_struct) };