in reply to Readonly vars as input to other modules

Instead of promoting the the definitions of the constants to compile time, you can instead load the module at run time:
use Config::Std; use Readonly; Readonly my $DEFAULT_LOG_LEVEL => q{warn}; Readonly my $DEFAULT_LOG_FILE => $PROGRAM_NAME . q{.log}; Readonly my $DEFAULT_CONFIG_FILE => $PROGRAM_NAME . q{.cfg}; read_config $DEFAULT_CONFIG_FILE => my %config; require Log::StdLog; Log::StdLog->import({ level => ($config{'log'}{'level'} || $DEFAULT_LOG_LEVEL), file => ($config{'log'}{'file' } || $DEFAULT_LOG_FILE ) });

Note that this also means that import of various subs and symbols happens at run time, so it might or might not work for you.