FAQ 4.36 How can I expand variables in text strings?

Discussion in 'Perl Misc' started by PerlFAQ Server, Feb 28, 2011.

  1. This is an excerpt from the latest version perlfaq4.pod, which
    comes with the standard Perl distribution. These postings aim to
    reduce the number of repeated questions as well as allow the community
    to review and update the answers. The latest version of the complete
    perlfaq is at http://faq.perl.org .


    4.36: How can I expand variables in text strings?

    (contributed by brian d foy)

    If you can avoid it, don't, or if you can use a templating system, such
    as "Text::Template" or "Template" Toolkit, do that instead. You might
    even be able to get the job done with "sprintf" or "printf":

    my $string = sprintf 'Say hello to %s and %s', $foo, $bar;

    However, for the one-off simple case where I don't want to pull out a
    full templating system, I'll use a string that has two Perl scalar
    variables in it. In this example, I want to expand $foo and $bar to
    their variable's values:

    my $foo = 'Fred';
    my $bar = 'Barney';
    $string = 'Say hello to $foo and $bar';

    One way I can do this involves the substitution operator and a double
    "/e" flag. The first "/e" evaluates $1 on the replacement side and turns
    it into $foo. The second /e starts with $foo and replaces it with its
    value. $foo, then, turns into 'Fred', and that's finally what's left in
    the string:

    $string =~ s/(\$\w+)/$1/eeg; # 'Say hello to Fred and Barney'

    The "/e" will also silently ignore violations of strict, replacing
    undefined variable names with the empty string. Since I'm using the "/e"
    flag (twice even!), I have all of the same security problems I have with
    "eval" in its string form. If there's something odd in $foo, perhaps
    something like "@{[ system "rm -rf /" ]}", then I could get myself in

    To get around the security problem, I could also pull the values from a
    hash instead of evaluating variable names. Using a single "/e", I can
    check the hash to ensure the value exists, and if it doesn't, I can
    replace the missing value with a marker, in this case "???" to signal
    that I missed something:

    my $string = 'This has $foo and $bar';

    my %Replacements = (
    foo => 'Fred',

    # $string =~ s/\$(\w+)/$Replacements{$1}/g;
    $string =~ s/\$(\w+)/
    exists $Replacements{$1} ? $Replacements{$1} : '???'

    print $string;


    The perlfaq-workers, a group of volunteers, maintain the perlfaq. They
    are not necessarily experts in every domain where Perl might show up,
    so please include as much information as possible and relevant in any
    corrections. The perlfaq-workers also don't have access to every
    operating system or platform, so please include relevant details for
    corrections to examples that do not work on particular platforms.
    Working code is greatly appreciated.

    If you'd like to help maintain the perlfaq, see the details in
    PerlFAQ Server, Feb 28, 2011
    1. Advertisements

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Tor Inge Rislaa
    Tor Inge Rislaa
    Feb 5, 2007
  2. Ben

    Strings, Strings and Damned Strings

    Ben, Jun 22, 2006, in forum: C Programming
    Jun 24, 2006
  3. Jerry C

    auto expand for text in a web page

    Jerry C, Jun 20, 2008, in forum: ASP .Net Web Controls
    Steven Cheng [MSFT]
    Jun 25, 2008
  4. PerlFAQ Server

    FAQ 4.25 How do I expand tabs in a string?

    PerlFAQ Server, Feb 11, 2011, in forum: Perl Misc
    PerlFAQ Server
    Feb 11, 2011
  5. PerlFAQ Server
    PerlFAQ Server
    Mar 6, 2011

Share This Page