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]]' '
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: super-simple regex-based template eval --- handling undefined substitutions
by iaw4 (Monk) on Sep 15, 2012 at 22:43 UTC |