Beefy Boxes and Bandwidth Generously Provided by pair Networks
XP is just a number
 
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
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 studying the Monastery: (8)
As of 2014-12-27 22:00 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    Is guessing a good strategy for surviving in the IT business?





    Results (177 votes), past polls