#! perl -slw require 5.8.8; use strict; use List::Util qw[ reduce ]; $a = $b; my %dispatch = ( A => sub{ map{ $_ +1 } @_ }, B => sub{ map{ $_ *2 } @_ }, C => sub{ map{ $_**2 } @_ }, D => sub{ map{ $_ +3 } @_ }, E => sub{ map{ $_ *5 } @_ }, ); my $func_com = $ARGV[ 0 ] || 'ABC'; my @some_val = 1 .. 10; my $combo = reduce{ { ## 1 my( $x, $y ) = ( $a, $b ); ## 3 $a = sub{ $y->( $x->( @_ ) ) } } ## 2 } map{ $dispatch{ $_ }||sub{ @_ } } split '', $func_com; printf "[ %s ]", join ',', $combo->( @some_val ); __END__ c:\test>\AS817\perl\bin\perl5.8.8.exe junk6.pl ABCDE [ 95,195,335,515,735,995,1295,1635,2015,2435 ]