Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation
 
PerlMonks  

Re: super-simple regex-based template eval --- handling undefined substitutions

by AnomalousMonk (Abbot)
on Sep 15, 2012 at 22:05 UTC ( #993883=note: print w/ replies, xml ) Need Help??


in reply to super-simple regex-based template eval --- handling undefined substitutions

>perl -wMstrict -le "my ($w, $x, $y) = qw(YUU EKS); ;; my $scalar = qr{ \$ \s* (?: { \s* \w+ } | \w+ ) }xms; ;; my $interpol = q{hi from '$w' and ${x}also $y and $z too}; ;; $interpol =~ s{ ($scalar) } { no warnings qw(ambiguous); my $e = eval qq{$1}; $@ ? qq{[['$1' non-existant]]} : ! defined($e) ? qq{[['$1' undefined]]} : $e; }xmseg; ;; print qq{'$interpol'}; " 'hi from 'YUU' and EKSalso [['$y' undefined]] and [['$z' non-existant] +] too'

Update: I like this one better: no no warnings, and it supports  \$ escaped dollars and all forms of scalars I know of, which are normalized to a canonical form (sorry for any pesky wraparound, which I tried to fix this up a bit) (tested under 5.8.9 and 5.14.2):

>perl -wMstrict -le "my ($w, $x, $y) = qw(YUU EKS); ;; my $interpol = q{hi \$w from '$w' and ${x}also $y and $z too} . qq{\n} . q{'$x' '$ x' '$ x' '${x}' '${ x}' '${ x}'} . qq{\n} . q{'$y' '$ y' '$ y' '${y}' '${ y}' '${ y}'} . qq{\n} . q{'$z' '$ z' '$ z' '${z}' '${ z}' '${ z}'} . qq{\n} ; print qq{$interpol}; ;; my $scalar = qr{ (?<! \\) \$ \s* (?: { \s* (\w+) } | (\w+) ) }xms; $interpol =~ s{ $scalar } { my $s = qq{\$$^N}; my $e = eval $s; $@ ? qq{[['$s' non-existant]]} : ! defined($e) ? qq{[['$s' undefined]]} : $e; }xmseg; ;; print qq{'$interpol'}; " hi \$w from '$w' and ${x}also $y and $z too '$x' '$ x' '$ x' '${x}' '${ x}' '${ x}' '$y' '$ y' '$ y' '${y}' '${ y}' '${ y}' '$z' '$ z' '$ z' '${z}' '${ z}' '${ z}' 'hi \$w from 'YUU' and EKSalso [['$y' undefined]] and [['$z' non-exist +ant]] too 'EKS' 'EKS' 'EKS' 'EKS' 'EKS' 'EKS' '[['$y' undefined]]' '[['$y' undefined]]' '[['$y' undefined]]' '[['$y' undefined]]' '[['$y' undefined]]' '[['$y' undefined]]' '[['$z' non-existant]]' '[['$z' non-existant]]' '[['$z' non-existant]]' '[['$z' non-existant]]' '[['$z' non-existant]]' '[['$z' non-existant]]' '


Comment on Re: super-simple regex-based template eval --- handling undefined substitutions
Select or Download Code
Replies are listed 'Best First'.
Re^2: super-simple regex-based template eval --- handling undefined substitutions
by iaw4 (Scribe) on Sep 15, 2012 at 22:43 UTC
    thank you. this does the job perfectly.

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others imbibing at the Monastery: (14)
As of 2015-07-28 19:21 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 (258 votes), past polls