use strict; use warnings; use constant DEBUG => @ARGV; my $v = { stuff => 0 }; my $template = '[% IF stuff %] yoda [% ELSE %] JEFFA [% END %]'; my $ot = $template; $template =~ s{ \[% \s+ IF \s+ (\w+) \s+ %\] # $1 var (.*?) # $2 then \[% \s+ END \s+ %\] } [ my( $a, $b, $c ) = ($1, $2, ''); # handleABC($v, $a,$b,$c); if($b =~ m/\[% \s+ ELSE \s+ %\]/gsx ){ my @c = split /\[%\s+ELSE\s+%\]/s, $b, 2; warn "c(",join('|',@c),")" if DEBUG; $b = $c[0]; $c = $c[1]; } warn "a($a) b($b) c($c)\n----\n" if DEBUG; defined $v->{$a} && $v->{$a} ? $b : $c; ]gsex; warn " \n\n ------------------ \n\n" if DEBUG; $ot =~ s{ \[% \s+ IF \s+ (\w+) \s+ %\] # $1 var (.*?) # $2 then \[% \s+ END \s+ %\] } [ handleABC($v, $1, $2, ''); ]gsex; print ">>>$template<<<\n"; print ">>>|$ot|<<<\n"; sub handleABC{ my( $v, $a, $b, $c ) = @_; warn "----\na($a) b($b) c($c)" if DEBUG; if($b =~ m/\[%\s+ELSE\s+%\]/s ){ my @c = split /\[%\s+ELSE\s+%\]/s, $b, 2; warn "c(",join('|',@c),")" if DEBUG; $b = $c[0]; $c = $c[1]; } warn "a($a) b($b) c($c)\n----\n" if DEBUG; defined $v->{$a} && $v->{$a} ? $b : $c; } __END__ >>>yoda [% ELSE %] JEFFA <<< >>>| JEFFA |<<<