sub say_hello { my $opts = shift; my $hello_sub = $opts->{hello_sub} // sub { my $o = shift; say "hello, ", $o->{who} // 'world' }; $hello_sub->($opts); } say_hello(); # says "hello, world" say_hello({ who => 'temporal'}); # says "hello, temporal" say_hello({ hello_sub => sub { my $o = shift; say "wazzup, ", $o->{zup} // 'homie' }, zup => 'bro' }); # says "wazzup, bro"