sub foo { print "foo: @_\n" } sub bar { print "bar: @_\n" } sub safe_dispatch { my ($dispatch, $name, $params) = @_; my ($code, @keys) = @{$dispatch->{$name}}; my @params = map { $_ => $params->{$_} } grep { exists $params->{$_} } @keys; return $code->(@params); } my %dispatch = ( foo => [ \&foo, qw/ foo common / ], bar => [ \&bar, qw/ bar common / ], ); my %params = ( foo => 1, bar => 1, common => 1, ); safe_dispatch(\%dispatch, $_, \%params) for qw/ foo bar /; __END__ foo: foo 1 common 1 bar: bar 1 common 1