Break it up peice by peice.
pair takes a "hash" and creates an AoA. Consider this code:
my @got = pair( . . . );
Where $i is any integer between 0 and scalar(@got), $got[$i][0] will contain the "hash" key, and $got[$i][1] will contain its value.
Taking the map statements in order of execution, the first one is:
my @got2 = map { [$_->[0],$_->[1],'meowmoo'] } @got;
@got2 is also an AoA, but this time containing three elements. The first two are exactly as they are in @got, and the thrid one is always 'meowmoo'.
The second map statement is a bit trickier:
my @got3 = map { &{$_->[1]}($_->[2]) ? $_->[0] : () } @got2;
This one needs to be broken up further:
&{$_->[1]} # Get the subroutine referanced in $got2[$i][1]
($_->[2]) ? # Pass in the value of $got2[$i][2] ('meowmoo')
$_->[0] : # If the subroutine returned true, then
# pass back the key of the "hash" associated
# with that subroutine.
() # Otherwise, return undef
@got3 is a simple array, and will contain ('cat', undef, 'cow'). Actually, I'd have to run the code to check if that undef is really there. Hopefully, this is a multiple-choice test and answers with and without the undef are not both present :) If I had to choose, I'd say that it would be.
---- I wanted to explore how Perl's closures can be manipulated, and ended up creating an object system by accident.
-- Schemer
Note: All code is untested, unless otherwise stated
|