use warnings FATAL => 'all'; use strict; doit({ func3 => [ \&up => [ qw(x y z) ] ] }); sub doit { my %defaults = ( func1 => [ sub { print map $_ . '1', @_ }, [ qw(a b) ] ], func2 => [ sub { print map $_ . '2', @_ }, [ qw(c d e) ] ], func3 => [ sub { print map $_ . '3', @_ }, [ qw(f g) ] ], ); my %args = (%defaults, %{ shift() }); for my $func (qw(func1 func2 func3)) { die "unknown func $func" unless exists $args{$func}; $args{$func}->[0]->(@{ $args{$func}->[1] }); print "\n"; } } sub up { print map uc, @_; }