sub my_map { my $sub = shift; my @out; for my $element ( @_ ) { push @out, $sub->( $element ); } return @out; } #### sub square { $_[0] * $_[0] } my @squares = my_map( \&square, 1..3 ); # @squares is now ( 1, 4, 9 ) #### my @squares = my_map( sub { $_[0]*$_[0] }, 1..3 ); #### my @squares = my_map sub { $_[0]*$_[0] }, 1..3; #### sub my_map { my $sub = shift; my @out; for ( @_ ) { push @out, $sub->(); # $sub will get its arg from $_ } return @out; } #### my @squares = my_map sub { $_ * $_ }, 1..3; #### my @squares = map { $_ * $_ } 1..3; # BLOCK form of map #### sub twice { $_ * 2 } #### my @evens = map &twice, 1..10; # EXPR form of map #### my @evens = my_map \&twice, 1..10; #### sub my_map (\&@_) { my $sub = shift; my @out; push @out, $sub->() for @_; return @out; } #### my @evens = my_map &twice, 1..10; #### sub my_map (&@) { my $sub = shift; my @out; push @out, $sub->() for @_; return @out; } #### my @evens = my_map { $_ * 2 } 1..3; #### my @evens = my_map $_ * 2, 1..10; # splat! #### my @ints = 1..3; my @evens = my_map { $_ *= 2 } @ints; print "@evens\n"; print "@ints\n"; __END__ 2 3 6 2 3 6 #### sub my_grep (&@) { my $sub = shift; my @out; $sub->() && push @out, $_ for @_; return @out; }