%vars = ( FTPPath => '/my/ftp/path', TransferMode => 'ASCII', ); s/(\$(\w+|{(\$|\w+)}))/ my $var = defined($3) ? $3 : $2; $var eq '$' ? '$' : (defined($vars{$var}) ? $vars{$var} : $1); /eg; #### %vars = ( FTPPath => '/my/ftp/path', TransferMode => 'ASCII', ); foreach ( 'cd $FTPPath', 'type ${TransferMode}', '${$}escaped!', ) { my $command = $_; $command =~ s/(\$(\w+|{(\$|\w+)}))/ my $var = defined($3) ? $3 : $2; $var eq '$' ? '$' : (defined($vars{$var}) ? $vars{$var} : $1); /eg; print("$command\n"); } __END__ ourput ====== cd /my/ftp/path type ASCII $escaped!