sub mapfirst { my( $sub )= shift( @_ ); &$sub( map { $_->[0] } @_ ); # ^^^^^^^^^^^^^^^^^^ Here is the selection code } my @a= ( 1..3 ); my @b= ( 4..6 ); my @c= ( 7..9 ); sub addten { $_ += 10 for @_ } mapfirst( \&addten, \@a, \@b, \@c ); mapfirst( sub { print "@_\n" }, \@a, \@b, \@c ); #### if( 0 == @_ ) { &$sub(); } elsif( 1 == @_ ) { &$sub( $_[0][0] ); } elsif( 2 == @_ ) { &$sub( $_[0][0], $_[1][0] ); } elsif( 3 == @_ ) { &$sub( $_[0][0], $_[1][0], $_[2][0] ); # etc to some arbitrary maximum number of arguments } #### eval "&\$sub( " . join( ", ", map "\$_[$_][0]", 0..$#_ ) . " )" #### $av= sub { \@_ }->( @$av, $_->[0] ) for @_; #### sub mapfirst { my( $sub )= shift( @_ ); my $av= []; $av= sub { \@_ }->( @$av, $_->[0] ) for @_; &$sub( @$av ); ## &$sub( map { $_->[0] } @_ ); } my @a= ( 1..3 ); my @b= ( 4..6 ); my @c= ( 7..9 ); sub addten { $_ += 10 for @_ } mapfirst( \&addten, \@a, \@b, \@c ); mapfirst( sub { print "@_\n" }, \@a, \@b, \@c ); #### ( $x, $y )= ( $y, $x ); #### sub swapPairs { @_[ map $_^1, 0..$#_ ]= @_ } #### $_= $something for @_; #### use Algoritm::Loops 'MapCarE'; sub swapValues { MapCarE { $_[0]= $_[1] } \@_, [reverse @_] }