I haven't bought
Higher Order Perl yet, but I've looked at the code examples and have been inspired. With that in mind:
# 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);
--
@/=map{[/./g]}qw/.h_nJ Xapou cets krht ele_ r_ra/;
map{y/X_/\n /;print}map{pop@$_}@/for@/