Beefy Boxes and Bandwidth Generously Provided by pair Networks
Don't ask to ask, just ask
 
PerlMonks  

RE: Double Interpolation of a String

by davorg (Chancellor)
on Jun 22, 2000 at 14:30 UTC ( #19415=note: print w/ replies, xml ) Need Help??


in reply to Double Interpolation of a String

For doing stuff with these kinds of substitutions, I always use code like this:

use strict; my %trans = (color => 'red', fruit => 'apple', name => 'chromatic'); my $string = 'Hi, my name is $name. Please hand me a $color $fruit.'; $string =~ s/\$(\w+)/$trans{$1}/eg; print $string;

--
<http://www.dave.org.uk>

European Perl Conference - Sept 22/24 2000
<http://www.yapc.org/Europe/>


Comment on RE: Double Interpolation of a String
Download Code
Replies are listed 'Best First'.
Infinite Recursion of a String
by tadman (Prior) on Feb 07, 2001 at 00:30 UTC
    With inspiration from davorg's above example, taking it a step further (and a step further (and a step further (...))):
    #!/usr/bin/perl -w use strict; my %trans = ( '$name' => 'Frank', '$color' => 'Cherry Red', '$time' => sprintf ("%d:%02d:%02d", (localtime(time))[2,1,0]), '$date' => sprintf ("%04d-%02d-%02d", (localtime(time))[5] + 1900, (localtime(time))[4] + 1, (localtime(time))[3]), '$dstr' => '$time on $date', ); my ($trans_rx) = join ('|', sort { length($b) - length($a) } sort map { quotemeta ($_) } keys %trans); my ($string) = 'I\'m $name and I prefer $color objects, at least +on $dstr'; while ($string =~ s!($trans_rx)!$trans{$1}!o) { } print "$string\n";
    For output like:
    I'm Frank and I prefer Cherry Red objects, at least on 15:33:43 o +n 2001-02-06
    This version doesn't replace stray references to things like $1.95 with nothing, but it might get caught in a loop if you specify two entries which convert to eachother recursively such that "$a -> $b" and "$b -> $a".
      It might be useful to protect against infinite recursion as well:
      my $max_recurs = 10; $max_recurs-- while $string =~ ... && $max_recurs; warn "Too many recursive substitutions on '$string'" if !$max_recurs && $^W;

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://19415]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others pondering the Monastery: (7)
As of 2015-07-08 01:04 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (93 votes), past polls