%map = ( UN => 0, RN => 1, LOC => 2, ); my $prompt = "-RN- (-LOC-)"; my @user_info = ("juser", "Joe", "3rd floor"); my @slices; $prompt =~ s{-([^-]+)-}{ if (exists $map{$1}) { push @slices, $map{$1}; "%s"; } else { "-$1-" } }eg; my $output = sprintf($pattern, @user_info[@slices]);