use List::Util qw(reduce); sub compose { reduce { sub { $b->($a->(@_)) } } @_; } #### sub compose { my $c = shift; foreach my $s (@_) { my $o = $c; $c = sub { $s->($o->(@_)) } } $c }