# combines two pairs into a longer pair sub combine_codes_and_descriptions { my ($sofar, $next) = @_; if (!defined($sofar)) {return $next;} [$sofar->[0] . $next->[0], $sofar->[1] . ", " . $next->[1]]; } sub multi_dim_reduce { # $sofar optional my ($actionsub, $AoA, $combinesub, $sofar) = @_; if (@$AoA) { my $this_array = shift @$AoA; for my $elem (@$this_array) { my $subarray = [ @$AoA ]; multi_dim_reduce($actionsub, $subarray, $combinesub, $combinesub->($sofar,$elem)); } } else { $actionsub->($sofar); } } # The main event @data = ( [ [1, "Darth Vader"], [3, "Luke Skywalker"], [5, "Obi Wan Kenobi"], ],[ [0, "Lighsabre"], [5, "Blaster"], [9, "Rocket launcher"], ],[ [10, "Dagobah"], [14, "Kashyyyk"], ], ); multi_dim_reduce(sub {my ($c,$d) = @{$_[0]}; print "$c\t$d\n";}, [ @data ], \&combine_codes_and_descriptions);