my $cmd_tmpl = { backup => '$bak_cmd $client > $file', list => '$list_cmd -le $client', ... } # all the names of the vars to be substituted my @all_my_vars = qw / bak_cmd client file list_cmd ... / ; #### sub some_func { my $func = 'backup'; my $client = 'mars'; my $cmd = eval_cmd($func); # here magic happens! seurity_check($cmd); system("$cmd"); } #### sub eval_cmd { my $key = shift; die "no such command: $key!" unless exists $cmd_template{$key}; my $cmd = $cmd_template{$key}; no strict "vars"; for my $var (@all_my_vars) { $cmd =~ s/\$var/$$var/g if defined $$var; } use strict "vars"; return $cmd; } #### # $client can be given, or not if ($client) { some_func(); } else { foreach $client (@{get_all_running_clients()}) { my $backup-cmd = eval_cmd('backup'); system('$backup-cmd'); } }